为什么不能GetType()。BaseClass找到基类?

时间:2017-03-23 15:16:04

标签: c# generics types

编辑:我的错,因为潜伏着另一个Foo定义让我对Foo<>定义感到困惑。

在下面的代码中,FooBar的基类对吗?

那么为什么编译器会强调.BaseType部分并说“给定的表达式永远不会提供(Form1.Foo)类型”?

    // has 1 virtual method
    class Foo<T> : IList<T>
    {
        ...
    }

    // overrides 1 method from Foo
    class Bar : Foo<float>
    {

    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        object o = new Bar();


        if (o is Bar)
        {
            Console.WriteLine("2222222 "+ o.GetType().BaseType);
            if(o.GetType().BaseType is Foo)
            {
                Console.WriteLine("2.5 2.5 2.5 2.5 2.5");
            }
        }
        if (o is object)
            Console.WriteLine("3333333");
    }

输出是:

2222222 VRAM.Form1+Foo`1[System.Single]
3333333

我正在尝试检查object是否已分配给从Foo派生的实例。因为在运行时,该对象将是原始数组或Foo<float>Foo<int>或其他T基元类型。

同样使用typeof(Foo<>)进行比较也不起作用。我只需要1个深度检查来自Foo<>或不是Bar。 (我不想检查Biz Baz referenceSizeForFooterInSection之类的所有类型,它们是整数双字符类型,之后会添加许多类型,所以我需要检入1行或最多2个)

2 个答案:

答案 0 :(得分:3)

o.GetType().BaseType会返回Type,而不是您可以使用isas查看的实例。

更好的表示法是:

if(o.GetType().BaseType.GetGenericTypeDefinition() == typeof(Foo<>))

如果要检查类型的相等性。通常虽然最好使用Type.IsAssignableFrom

答案 1 :(得分:1)

问题中给出的代码将无法编译,除非你有一个非泛型Foo。要使用typeof(Foo<>),您应该使用Type.GetGenericTypeDefinition MSDN - Type

if(o.GetType().BaseType is Foo){
    Console.WriteLine("2.5 2.5 2.5 2.5 2.5");
}
  

我只需要对来自Foo&lt;&gt;的物体o进行1深度检查。或不。

if(o.GetType().BaseType.GetGenericTypeDefinition() == typeof(Foo<>)){
    //STUFF
}

应该有效