如果任何类在其层次结构的某个阶段实现IEnumerable
接口,是否可以创建一个集合并填充该类?
我想编写一个简单的函数,如果它需要一个实现IList<>
,ICollection<>
,IEnumerable<>
等的对象,或者是Array
(所以全部在某个阶段实现IEnumerable
),我可以用一组值填充它。
因此,此功能无法知道它是否会收到List<object>
或object[]
,但可以填充这两种功能。
感谢。
答案 0 :(得分:0)
IEnumerable接口仅指定一个方法,该方法为您提供枚举对象项目的枚举器。因此,没有关于对象的其他能力是什么的信息。因此,您无法判断物品的数量是固定的,还是可变的,甚至是外部可变的。
提供此功能的第一个接口是IList,除随机访问外,还提供添加对象的方法。仅仅因为你有一个IList,它并不意味着你有写入权限,因为IList可以是只读的。还有IDictionary指定类似字典对象的添加方法。所有其他标准集合通常不会实现为您提供此功能的界面。
因此,您无法在不知道其实现的情况下使用值填充任意集合,或至少更具体的实现细节(IList或IDictionary)。
我不需要捕获所有功能,我只需要覆盖大多数实例。因此,如果IEnumerable,ICollection或IList被传递,那么我只能返回一个列表。
如果你得到IList<T>
或ICollection<T>
,你也有IEnumerable<T>
(因为两者都实现了),所以你只有一个案例。您可以接受IEnumerable并根据它创建一个列表:
public IList<T> CreateList<T> (IEnumerable<T> enumerable)
{
List<T> list = new List<T>(enumerable);
// add custom items
list.Add(GetCustomItem<T>());
return list;
}
如果您愿意,您也可以通过从定义中删除所有<T>
来制作非通用的版本。