如何将通用集合限制为 class 名称和接口

How to constrain a generic collection to both a class name and an interface

给定 public class BaseClass

已导出 类,其中 其中一些 遵循以下形式

public class DerivedClass : BaseClass, ISpecificInterface

有没有一种方法可以指定仅适用于实现该接口的派生 类 的集合?

例如,

public List<BaseClass where ISpecificInterface> myList;

public List<BaseClass : ISpecificInterface> myList;

只能约束泛型参数,不能约束泛型实参。所以你需要:

public class DerivedClassWithInterfaceListContainer<TDerived>
    where TDerived : BaseClass, ISpecificInterface
{
    public List<TDerived> MyList { get; set; }
}

可能 想要继承 List<T> 为此:

public class DerivedList<TDerived> : List<TDerived>
    where TDerived : BaseClass, ISpecificInterface
{    
}

然后您可以将其用作 属性 类型:

public DerivedList<SomeDerivedClass> MyList { get; set; }

重点是:您只能将列表声明为包含一种类型。因此,如果您想要一个列表,该列表可以包含 any class 派生自 BaseClass and 实现 ISpecificInterface,你必须在一个方法中这样做:

// either ISpecificInterface _or_ BaseClass
private List<ISpecificInterface> myList;

public void AddToList<TDerived>(TDerived toAdd)
    where TDerived : BaseClass, ISpecificInterface
{
    myList.Add(toAdd);
}

然后你可以结合这个:

public class DerivedList : List<ISpecificInterface>    
{    
    public new void Add<TDerived>(TDerived toAdd)
        where TDerived : BaseClass, ISpecificInterface
    {
        this.Add(toAdd);
    }
}

但现在有人可以将您的 DerivedList 转换为 IList<ISpecificInterface> 并对其调用 Add(),对象实现 ISpecificInterface 但不继承自 BaseClass.