C# de Génériques et de la Vérification de Type
J'ai une méthode qui utilise un IList<T>
en tant que paramètre. J'ai besoin de vérifier que le type de l' T
objet et en faire quelque chose de basé sur elle. J'ai essayé d'utiliser le T
valeur, mais le compilateur ne le permet pas. Ma solution est la suivante:
private static string BuildClause<T>(IList<T> clause)
{
if (clause.Count > 0)
{
if (clause[0] is int || clause[0] is decimal)
{
//do something
}
else if (clause[0] is String)
{
//do something else
}
else if (...) //etc for all the types
else
{
throw new ApplicationException("Invalid type");
}
}
}
Il y a une meilleure façon de le faire. Est-il un moyen que je puisse vérifier le type de T
qui est passé et ensuite utiliser un switch
déclaration?
- J'aurais personnellement aimé savoir ce que vous êtes en train de faire de spécial pour chaque type de données. Si vous êtes en train de faire à peu près la même transformation pour chaque type de données, il peut être plus facile pour cartographier les différents types d'une interface commune et sur cette interface.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser les surcharges:
Ou vous pouvez inspecter le type du paramètre générique:
switch-case
au lieu deif-else
?Vous pouvez utiliser
typeof(T)
.Par défaut sais qu'il n'est pas d'une grande manière. Pendant quelque temps en arrière, je suis frustré par cette et écrit un petit utilitaire de la classe qui a aidé un peu et fait la syntaxe un peu plus propre. Essentiellement, il transforme le code en
Plein de blog et des détails sur la mise en œuvre sont disponibles ici
L'opérateur typeof...
... ne fonctionne pas avec le c# de l'instruction switch. Mais comment à ce sujet? Le post suivant contient une classe statique...
Est-il une meilleure alternative que de ce "de type"?
...qui va vous permettre d'écrire du code comme ceci:
Il n'y a aucun moyen d'utiliser l'instruction switch pour ce que vous voulez qu'il fasse. L'instruction switch doit être fourni avec les types intégraux, qui ne comprennent pas les types complexes comme un "Type" d'objet, ou de tout autre type d'objet pour cette question.
Votre construction va à l'encontre de l'objectif d'une méthode générique. C'est moche sur le but parce qu'il doit y avoir une meilleure façon d'obtenir ce que vous essayez d'accomplir, même si vous n'avez pas donné assez d'informations pour comprendre ce que c'est.
Pour tout le monde qui dit que la vérification de types et de faire quelque chose basé sur le type n'est pas une bonne idée pour les génériques, je me suis d'accord, mais je pense qu'il pourrait y avoir des circonstances où cela est parfaitement logique.
Par exemple, si vous avez une classe qui dire, c'est implémentée comme (Note: je ne suis pas ce que ce code n'est pour des raisons de simplicité et ont simplement copié et collé dans ici, donc il ne peut pas construire ou de travailler comme prévu comme tout le code n'mais il obtient le point à travers. Aussi, l'Unité est un enum):
...
Donc en résumé, je pense qu'il y a des raisons valables pour lesquelles vous pourriez vouloir vérifier pour voir quel type générique, pour en faire quelque chose de spécial.
Vous pouvez faire
typeOf(T)
, mais je voudrais vérifier votre méthode et assurez-vous que votre ne viole seule responsabilité ici. Ce serait une odeur de code, et ce n'est pas à dire qu'il ne faut pas le faire mais que vous devez être prudent.Le point de génériques est d'être capable de construire par type agnostique algorthims ont été vous ne vous souciez pas de quel type est ou tant qu'il s'inscrit dans un certain nombre de critères. Votre application n'est pas très générique.
Comment à ce sujet :
J'espère que vous trouverez ce utile:
typeof(IList<T>).IsGenericType == true
typeof(IList<T>).GetGenericTypeDefinition() == typeof(IList<>)
typeof(IList<int>).GetGenericArguments()[0] == typeof(int)
https://dotnetfiddle.net/5qUZnt
Et, parce que le C# a évolué, vous pouvez maintenant utiliser le pattern matching