【问题标题】:List of Types that implement an interface or base class实现接口或基类的类型列表
【发布时间】:2020-03-13 08:33:55
【问题描述】:

我将如何定义一个类型列表 (List<Type>),我想将此列表中的类型限制为实现接口或基类的类型?

对于我想要实现的一个非常简化的示例,我有一个抽象类 Foo 有许多不同的子类 FooAFooBFooCFooD 等。然后我还有另一个类BarAD 具有允许的Foo 类型列表(FooAFooD)用于某些操作。然后会发生以下情况:

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&lt;Type&gt; 只接受 Foo 类的子类型?

【问题讨论】:

  • 你不能在编译时限制这个。 Type 是一个 .NET 类,它适用于所有类型。您可以通过使用反射来限制运行时。 Check Here
  • 您正在寻找IsAssignableFrom,类型为Type
  • @Enigmativity 我将如何使用它来做我需要的事情?
  • @SushiYetiDev - 类似于var derived = this.GetType().Assembly.GetTypes().Where(x =&gt; typeof(Foo).IsAssignableFrom(x)).ToList();

标签: c# list types interface base-class


【解决方案1】:

也许你可以使用通用约束。

public class BarAD
{
    private List<Type> Types = new List<Type>();

    public void Add<T>() where T : Foo
    {
        Types.Add( typeof( T ) );
    }
}

static void Main( string[] args )
{
    BarAD bar = new BarAD();
    bar.Add<FooA>();
    bar.Add<FooD>();
}

虽然我觉得这有点奇怪。通常我喜欢使用多态性而不是类型。

【讨论】:

  • 我同意这种感觉。我也觉得这很奇怪,但我没有找到更好的方法来实现我想要做的事情。这样做的原因是它是程序算法的一部分,我们需要能够保存它的结果。我会记住您的建议并尝试一下,但我认为它无法完成我想要它做的事情。
  • 这没有回答这个问题:“有什么方法可以限制我的 List&lt;Type&gt; 只接受 Foo 类的子类型?”
猜你喜欢
  • 2016-07-22
  • 2012-11-30
  • 1970-01-01
  • 2015-08-27
  • 2010-09-30
  • 2013-03-06
  • 2019-06-27
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多