如何将通用集合限制为 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
.
给定 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
.