说我有一个简单的通用类,如下

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");

10-08 03:33