使用反射的通用集合映射

时间:2013-01-28 10:15:59

标签: c# generics ienumerable

如果任何类在其层次结构的某个阶段实现IEnumerable接口,是否可以创建一个集合并填充该类?

我想编写一个简单的函数,如果它需要一个实现IList<>ICollection<>IEnumerable<>等的对象,或者是Array(所以全部在某个阶段实现IEnumerable),我可以用一组值填充它。

因此,此功能无法知道它是否会收到List<object>object[],但可以填充这两种功能。

感谢。

1 个答案:

答案 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>来制作非通用的版本。