嘿,我有一个抽象的泛型BList<TElement> where TElement : Career
。职业也是抽象类型。
给定类型T,如何测试它是否为BList类型?我怎样才能投入基类?我试过(BList<Career>)object
,但编译器很不高兴。显然我不能写BList<Career>
因为职业是抽象的。
答案 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
那么它不属于那种类型。