Чтобы проверить, является ли ваш экземпляр типа MyGenericClass<T>
, вы можете написать что-то вроде этого.
MyGenericClass<string> myClass = new MyGenericClass<string>();
bool b = myClass.GetType().GetGenericTypeDefinition() == typeof(MyGenericClass<>);
Если вы хотите иметь возможность объявить ваш объект как MyGenericClass
вместо MyGenericClass<string>
, ему потребуется неуниверсальная база MyGenericClass
, чтобы быть частью дерева наследования.Но на этом этапе вы сможете ссылаться только на свойства / методы на базе, если позже не приведете к производному универсальному типу.Вы не можете опустить параметр типа при непосредственном объявлении универсального экземпляра. *
* Вы, конечно, можете выбрать вывод типа и написать
var myClass = new MyGenericClass<string>();
Редактировать: Адам Робинсон делает хорошее замечание в комментариях, скажем, у вас есть class Foo : MyGenericClass<string>
.Приведенный выше код тестирования не идентифицирует экземпляр Foo как MyGenericClass<>
, но вы все равно можете написать код для его проверки.
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");