以下是一个常见问题的简单示例:
ICollection<int> myIntegers = ....
ICollection<string> myStrings = ....
在某些时候,我传递了这些和其他的实例 接收它们的方法的类型键入为IEnumerable。 (非通用形式)。
不通过反射黑客攻击后门, 该代码无法确定:
1. That the instance is a constructed type of ICollection<T>
2. The number of elements in the ICollection<T>-based type.
不知道通用参数是什么。
当我定义提供操作的泛型类型时 那些不依赖于泛型参数类型 (例如,像ICollection的Count属性),我 我通常定义一个非泛型基类型,即 我把非类型依赖操作放在哪里,如下所示:
public abstract class FrugalList
{
public abstract int Count {get;}
}
public class FrugalList<T> : FrugalList
{
public override int Count {get{...}}
void Add(T item) {...}
}
鉴于此,我可以使用抽象基类型 获取任何类型的实例的Count 构造在泛型类型定义上, 容易。
所以,问题很简单,你认为 提供此功能非常重要 (也可以通过接口完成)?
答案 0 :(得分:0)
在我看来,这是你调用的方法的问题。
如果该方法要求IEnumerable
,它向调用者声明它不需要超过该接口提供的内容。
如果该方法需要知道Count,它应该只是要求正确的接口,例如,变为泛型,并使用ICollection<T>
类型的参数声明。
也就是说,当存在执行该作业的现有标准接口时,无需创建“新”集合类型。