编辑:我的错,因为潜伏着另一个Foo
定义让我对Foo<>
定义感到困惑。
在下面的代码中,Foo
是Bar
的基类对吗?
那么为什么编译器会强调.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个)
答案 0 :(得分:3)
o.GetType().BaseType
会返回Type
,而不是您可以使用is
或as
查看的实例。
更好的表示法是:
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
}
应该有效