嘿,我有一个抽象的泛型类型 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/

10-10 01:42