4

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

给定一个类型 T,我如何测试它是否是 BList 类型?以及如何转换为基类?我试过(BList<Career>)object了,但编译器很不高兴。显然我不会写BList<Career>,因为职业是抽象的。

4

2 回答 2

8

你的问题有点模棱两可,所以我会尝试回答一些我认为你可能会问的事情......

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

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

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

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

但是,如果你只是想看看它是否是any BList<>,你可以使用反射:

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

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

现在,至于如何将 aBList<TElement>转换为 a BList<Career>?你不能安全。

这与抽象无关,它与即使继承自也不继承Career的事实有关。BList<Career>BList<TElement>CareerTElement

考虑一下:

public class Animal { }

public class Dog : Animal { }

public class Cat : Animal { }

鉴于这些,问问你自己为什么这不起作用:

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

看到问题了吗?如果我们允许您将 a 强制List<Cat>转换为 a List<Animal>,那么突然之间该Add()方法将支持Animal而不是Cat,这意味着您可以这样做:

animals.Add(new Dog());

显然,我们不可能将 a 添加Dog到 a List<Cat>。这就是为什么即使继承自也不能将 aList<Cat>用作 a 的原因。List<Animal>CatAnimal

类似的情况在这里。

于 2012-09-26T15:59:27.973 回答
1
var item = theObject as BList<Career>;  

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

于 2012-09-26T15:55:10.560 回答