说我有一个简单的通用类,如下
public class MyGenericClass<t>
{
public T {get;set;}
}
如何测试类的实例是否为
MyGenericClass
?例如,我想做这样的事情:MyGenericClass x = new MyGenericClass<string>();
bool a = x is MyGenericClass;
bool b = x.GetType() == typeof(MyGenericClass);
但是我不能只引用
MyGenericClass
。 Visual Studio一直希望我写MyGenericClass<something>
。 最佳答案
要测试您的实例是否为MyGenericClass<T>
类型,可以编写如下内容。
MyGenericClass<string> myClass = new MyGenericClass<string>();
bool b = myClass.GetType().GetGenericTypeDefinition() == typeof(MyGenericClass<>);
如果要能够将对象声明为
MyGenericClass
而不是MyGenericClass<string>
,则它需要MyGenericClass
的非通用基数成为继承树的一部分。但是到那时,除非稍后将其转换为派生的泛型类型,否则您将只能在基础上引用属性/方法。直接声明泛型实例时,不能忽略type参数。**您当然可以选择使用类型推断并编写
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");