通过反思访问集合

Bob*_*erg 29 c# reflection collections

有没有办法使用反射迭代(通过foreach优先)集合?我正在使用反射迭代对象中的属性,当程序到达一个集合类型时,我希望它迭代集合的内容并能够访问集合中的对象.

目前,我在所有属性上都设置了属性,并且在集合属性上将IsCollection标志设置为true.我的代码检查此标志,如果是,则使用反射获取Type.有没有办法在某个集合上以某种方式调用GetEnumerator或Items才能迭代这些项目?

Dar*_*opp 35

我有这个问题,但我没有使用反射,而是直接检查它是否是IEnumerable.所有的集合都实现了

if (item is IEnumerable)
{
    foreach (object o in (item as IEnumerable))
    {

    }
} else {
   // reflect over item
}
Run Code Online (Sandbox Code Playgroud)

  • 执行它可能更有效:var enumItem = item as IEnumerable; if(enumItem!= null)//做foreach (4认同)
  • 如不需要,你用它检查它是如此简单的演员阵容很好 (2认同)

Nag*_*man 29

我尝试使用与Darren建议类似的技术,但请注意,不只是集合实现了IEnumerable.string例如,也是IEnumerable,将迭代字符.

这是一个小函数,我用来确定一个对象是否是一个集合(由于ICollection也是IEnumerable,它也是可枚举的).

    public bool isCollection(object o)
    {
        return typeof(ICollection).IsAssignableFrom(o.GetType())
            || typeof(ICollection<>).IsAssignableFrom(o.GetType());
    }
Run Code Online (Sandbox Code Playgroud)


jop*_*jop 8

只需获取属性的值,然后将其转换为IEnumerable.这里有一些(未经测试的)代码可以给你一个想法:

ClassWithListProperty obj = new ClassWithListProperty();
obj.List.Add(1);
obj.List.Add(2);
obj.List.Add(3);

Type type = obj.GetType();
PropertyInfo listProperty = type.GetProperty("List", BindingFlags.Public);
IEnumerable listObject = (IEnumerable) listProperty.GetValue(obj, null);

foreach (int i in listObject)
    Console.Write(i); // should print out 123
Run Code Online (Sandbox Code Playgroud)