嘿,我有一个抽象的泛型类型 BList<TElement> where TElement : Career
。事业也是抽象的。
给定一个类型 T,我如何测试它是否是 BList 类型?我怎样才能转换到基类?我试过 (BList<Career>)object
但编译器不高兴。显然我不能写 BList<Career>
因为职业是抽象的。
最佳答案
你的问题有点含糊不清,所以我会尝试回答一些我认为你可能会问的问题......
如果你想检查一个实例 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
。考虑一下:
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
鉴于这些,问问你自己为什么这不起作用:
List<Animal> animals = new List<Cat>();
看到问题了吗?如果我们允许您将
List<Cat>
转换为 List<Animal>
,那么突然之间 Add()
方法将支持 Animal
而不是 Cat
,这意味着您可以这样做:animals.Add(new Dog());
显然,我们不可能将
Dog
添加到 List<Cat>
。这就是为什么您不能将 List<Cat>
用作 List<Animal>
的原因,即使 Cat
继承自 Animal
。类似的情况在这里。
关于c# - 如何测试 Type 是否派生自抽象基泛型类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12605661/