【发布时间】:2020-03-13 08:33:55
【问题描述】:
我将如何定义一个类型列表 (List<Type>),我想将此列表中的类型限制为实现接口或基类的类型?
对于我想要实现的一个非常简化的示例,我有一个抽象类 Foo 有许多不同的子类 FooA、FooB、FooC、FooD 等。然后我还有另一个类BarAD 具有允许的Foo 类型列表(FooA 和FooD)用于某些操作。然后会发生以下情况:
public class BarAD
{
private List<Type> fooTypes;
public BarAD()
{
fooTypes = new List<Type>() { typeof(FooA), typeof(FooD) };
}
public void Execute(Foo obj)
{
foreach (var fooType in fooTypes)
{
if (obj is fooType)
obj.DoSomething();
}
}
}
按照它目前的工作方式,我可以使用列表中的任何类型。某些方法可以在列表中添加 String 或 Integer 作为类型,并且代码可以正常编译和运行,这让我的生活变得更加复杂。这让我回到了这个问题:有什么方法可以限制我的 List<Type> 只接受 Foo 类的子类型?
【问题讨论】:
-
你不能在编译时限制这个。
Type是一个 .NET 类,它适用于所有类型。您可以通过使用反射来限制运行时。 Check Here -
您正在寻找
IsAssignableFrom,类型为Type。 -
@Enigmativity 我将如何使用它来做我需要的事情?
-
@SushiYetiDev - 类似于
var derived = this.GetType().Assembly.GetTypes().Where(x => typeof(Foo).IsAssignableFrom(x)).ToList();。
标签: c# list types interface base-class