如何测试Type是否从抽象基类泛型类型派生?

时间:2012-09-26 15:52:08

标签: c# .net types

嘿,我有一个抽象的泛型BList<TElement> where TElement : Career。职业也是抽象类型。

给定类型T,如何测试它是否为BList类型?我怎样才能投入基类?我试过(BList<Career>)object,但编译器很不高兴。显然我不能写BList<Career>因为职业是抽象的。

2 个答案:

答案 0 :(得分:8)

你的问题有些含糊不清,所以我会尝试回答一些我认为你可能要问的事情......

如果您想检查实例T是否为BList,可以使用is

if (someInstance is BList<Career>)
{
...
}

如果您想查看泛型类型参数是BList<Career>,可以使用typeof

if (typeof(T) == typeof(BList<Career>)
{
...
}

但是,如果您只是想知道它是否任何 BList<>,您可以使用反射:

var t = typeof(T);  // or someInstance.GetType() if you have an instance

if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BList<>))
{
    ...
}

现在,就如何将BList<TElement>投射到BList<Career>而言?你不能安全。

这与Career是抽象的无关,它与BList<Career> 继承BList<TElement>的事实有关,即使Career TElement 1}}继承自public class Animal { } public class Dog : Animal { } public class Cat : Animal { }

考虑一下:

List<Animal> animals = new List<Cat>();

鉴于这些,请问yoruself为什么这不起作用:

List<Cat>

看到问题?如果我们允许您将List<Animal>投射到Add(),那么Animal方法突然支持Cat而不是animals.Add(new Dog()); ,这意味着您可以做到这一点:

Dog

显然,我们无法向List<Cat>添加List<Cat>。这就是为什么即使List<Animal>继承自Cat,您也无法将Animal用作{{1}}。

这里类似的情况。

答案 1 :(得分:1)

var item = theObject as BList<Career>;  

如果它是null那么它不属于那种类型。