如何检查对象是否属于泛型类型?

时间:2009-10-08 08:57:14

标签: c#

为了争论,我有一个object。我无法修改我的函数的签名,因为我正在扩展其他人的类。

举一个具体的例子,我有以下内容:

class Foo<T> : SomeBaseClass
{
    public override MyFunction(object value)
    {
        // TODO: Figure out if value is an instance of Foo, though I don't care
        // what type was associated with it.
    }
}

有没有办法确保valueFoo类型的某个实例?

3 个答案:

答案 0 :(得分:6)

好吧,如果你想检查它是否完全一个Foo<something>,这很容易:

Type type = value.GetType();
if (!type.IsGenericType)
{
    throw new ArgumentException("Not a generic type");
}
if (type.GetGenericTypeDefinition() != typeof(Foo<>))
{
    throw new ArgumentException("Not the right generic type");
}

如果您需要确定它是某种来自Foo<T> 的类型,那就稍微难了 - 因为您不一定知道它在哪里是通用的。例如,它可能是:

class Bar : Foo<string>

class Baz<T> : Foo<T>

使事情变得更容易的另一种方法可能是引入另一个非泛型类:

abstract class Foo : SomeBaseClass

class Foo<T> : Foo

然后你可以这样做:

if (value is Foo)

当然,这也允许从Foo派生的其他类型。在许多情况下,这确实不是问题,但这取决于您的具体情况。您也可以将任何不需要引用T的成员放入Foo,这样您就可以在不关心T的情况下访问它们。

答案 1 :(得分:2)

您可以尝试在value.GetType()上调用GetGenericTypeDefinition。这基本上会给你Foo<>或抛出异常。要避免后者,请检查IsGenericType标志。

答案 2 :(得分:0)

如果你要从基类中重写,我认为你不能这样做。

你可以沿着这些方向做点什么。最大的缺点是你松开了编译时类型检查并将其留给了运行时。

class Foo<T> : SomeBaseClass
{
    public override MyFunction(object value)
    {
       if(value.GetType() != typeof(T))
       {
          // wrong type throw exception or similar
       }
    }
}