Vérification du paramètre de type d’une méthode générique en C #

Est-il possible de faire quelque chose comme ça en C #:

public void DoSomething(T t) { if (T is MyClass) { MyClass mc = (MyClass)t ... } else if (T is List) { List lmc = (List)t ... } } 

    Oui:

     if (typeof(T) == typeof(MyClass)) { MyClass mc = (MyClass)(object) t; } else if (typeof(T) == typeof(List)) { List lmc = (List)(object) t; } 

    Il est un peu étrange que vous ayez besoin de passer par un cast pour objecter, mais c’est exactement la façon dont fonctionnent les génériques – il n’y a pas autant de conversions d’un type générique que vous pourriez l’imaginer.

    Bien entendu, une autre solution consiste à utiliser la vérification du temps d’exécution normale:

     MyClass mc = t as MyClass; if (mc != null) { // ... } else { List lmc = t as List; if (lmc != null) { // ... } } 

    Cela se comportera différemment du premier bloc de code si t est nul, bien sûr.

    J’essaierais cependant d’éviter ce type de code dans la mesure du possible – cela peut être nécessaire parfois, mais l’idée de méthodes génériques est de pouvoir écrire un code générique qui fonctionne de la même manière pour n’importe quel type.

    Nous sums en 2017 et nous avons maintenant le C # 7 avec correspondance de modèle. Si votre type T hérite d’un object vous pouvez coder comme ceci

     void Main() { DoSomething(new MyClass { a = 5 }); DoSomething(new List { new MyClass { a = 5 }, new MyClass { a = 5 }}); } public void DoSomething(object t) { switch (t) { case MyClass c: Console.WriteLine($"class.a = {ca}"); break; case List l: Console.WriteLine($"list.count = {l.Count}"); break; } } class MyClass { public int a { get; set;} } 

    Je crois qu’il y a quelque chose qui ne va pas dans votre conception. Vous voulez comparer les types dans une méthode déjà générique. Les génériques sont destinés à traiter des situations de type variable. Je recommande de le faire de cette façon ..

     //Generic Overload 1 public void DoSomething(T t) where T : MyClass { ... } //Generic Overload 2 public void DoSomething(T t) where T : List { ... } 

    À partir de C # 7, vous pouvez le faire de manière concise avec l’opérateur is :

     public void DoSomething(T value) { if (value is MyClass mc) { ... } else if (value is List lmc) { ... } } 

    Voir la documentation: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is#pattern-matching-with-is