【问题标题】:How to compare generic parameter types?如何比较泛型参数类型?
【发布时间】:2013-04-10 20:16:34
【问题描述】:

我有一个包含泛型类型的类:

class MyClass<T>
{
}

T 类型可以是任何类型,包括MyClass&lt;AnotherType&gt;。 是的,这有点递归,可以有 MyClass&lt;MyClass&lt;MyClass&lt;T&gt;&gt;&gt; 之类的东西。

在某些时候,在 MyClass 中,我想知道 TMyClass&lt;AnyOtherType&gt; 还是派生自 MyClass&lt;AnyOtherType&gt; 的任何类型。 (不管 AnyOtherType 是什么,只需要知道 T 是否是 MyClass)。

那么,如何比较 T 型和MyClass&lt;anything&gt;


为了避免参数出现问题,我想到的另一件事是让MyClass&lt;T&gt; 继承MyClass(不带参数),以便于比较。

class MyClass<T> : MyClass

但问题仍然存在:

How can I compare T with MyClass to know if it's some type that inherits MyClass??

【问题讨论】:

  • 关于“剩下的问题”。 typeof(MyClass).IsAssignableFrom(typeof(T))(我认为)。

标签: c# generics type-parameter


【解决方案1】:

您必须检查反射 - 递归地解释“派生自”:

static bool IsMyClass(object obj)
{
    return obj == null ? false : IsMyClass(obj.GetType());
}
static bool IsMyClass(Type type)
{
    while (type != null)
    {
        if (type.IsGenericType &&
            type.GetGenericTypeDefinition() == typeof(MyClass<>))
        {
            return true;
        }
        type = type.BaseType;
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多