Pour tester si votre instance est de type MyGenericClass<T>
, vous pouvez écrire quelque chose comme ceci.
MyGenericClass<string> myClass = new MyGenericClass<string>();
bool b = myClass.GetType().GetGenericTypeDefinition() == typeof(MyGenericClass<>);
Si vous voulez être en mesure de déclarer votre objet comme MyGenericClass
au lieu de MyGenericClass<string>
, il aurait besoin d'une base non générique de MyGenericClass
pour faire partie de l'arbre d'héritage. Mais à ce stade, vous ne pourrez vous référer aux propriétés/méthodes de la base que si vous les convertissez plus tard en un type générique dérivé. Vous ne pouvez pas omettre le paramètre de type en déclarant directement une instance générique *
* Vous pouvez, bien sûr, choisir d'utiliser l'inférence de type et d'écrire
var myClass = new MyGenericClass<string>();
Edit:. Adam Robinson fait un bon point les commentaires, disons que vous avez class Foo : MyGenericClass<string>
. Le code de test ci-dessus n'identifie pas une instance de Foo comme MyGenericClass<>
, mais vous pouvez toujours écrire du code pour le tester.
Func<object, bool> isMyGenericClassInstance = obj =>
{
if (obj == null)
return false; // otherwise will get NullReferenceException
Type t = obj.GetType().BaseType;
if (t != null)
{
if (t.IsGenericType)
return t.GetGenericTypeDefinition() == typeof(MyGenericClass<>);
}
return false;
};
bool willBeTrue = isMyGenericClassInstance(new Foo());
bool willBeFalse = isMyGenericClassInstance("foo");
Notez que cela ne fonctionnera pas si la classe est * dérivée * d'une forme générique de la classe. En d'autres termes, 'public class Foo: MyGenericClass {}' ne serait pas admissible. –
@Adam, bon point. Vous pouvez écrire du code pour aller un peu plus loin pour tester. Je vais ajouter * une idée * sur la façon de le faire. –