代码之家  ›  专栏  ›  技术社区  ›  Matthew Scharley

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

c#
  •  2
  • Matthew Scharley  · 技术社区  · 15 年前

    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.
        }
    }
    

    有没有办法确保这一点 value 这是一个例子 Foo 类型

    3 回复  |  直到 15 年前
        1
  •  6
  •   Matthew Scharley    15 年前

    好吧,如果你想检查一下 确切地 A. 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 进入 T

        2
  •  2
  •   Anton Gogolev    15 年前

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

        3
  •  0
  •   Ian    15 年前

    我认为如果您是从基类重写的话,就无法做到这一点。

    不过,你可以按照这些思路做些事情。最大的缺点是您没有进行编译时类型检查,而是将其留给运行时。

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