Oui:
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
Il est un peu étrange que vous devez passer par un casting objecter, mais c'est exactement comme ça que fonctionnent les génériques - il n'y a pas autant de conversions à partir d'un type générique que l'on pourrait s'y attendre.
Bien sûr une autre alternative est d'utiliser le contrôle du temps d'exécution normale:
MyClass mc = t as MyClass;
if (mc != null)
{
// ...
}
else
{
List<MyClass> lmc = t as List<MyClass>;
if (lmc != null)
{
// ...
}
}
Cela se comportent différemment au premier bloc de code si t
est nul, bien sûr.
Je essayer d'éviter ce genre de code lorsque cela est possible, cependant - il peut être parfois nécessaire, mais l'idée de méthodes génériques est d'être capable d'écrire code générique qui fonctionne de la même manière pour tout type .
J'ai en fait un problème un peu plus compliqué. Que se passe-t-il si MyClass provient de MyBaseClass et qu'il y a beaucoup plus de MyClasses qui proviennent toutes de MyBaseClass? – synergetic
@synergetic: Vous avez décrit la hiérarchie des types, mais pas ce que vous voulez en faire. Vous pouvez utiliser la réflexion (par exemple 'typeof (T) .BaseType' ou' typeof (T) .IsAssignableFrom (...) 'pour explorer la hiérarchie des types si cela est utile, mais j'essaierais quand même de l'éviter si possible :) –
Hate pour être une serviette humide ici, mais cette réponse est insuffisante dans les cas où T est en fait un type encadré (ex: object boxedMyClass = new MyClass()). Dans ce cas, le type renvoyé par l'opérateur typeof sera objet, pas MyClass, ce qui entraînera l'échec de la vérification de type ci-dessus. À mon avis, c'est là que C# est un langage: traitant à la fois du filtrage de type générique et de la logique ontologique complexe (par exemple, il n'y a pas moyen de dire quelque chose comme «Mammal and Bear»).). – rmiesen