有没有办法使用反射迭代(通过foreach优先)集合?我正在使用反射迭代对象中的属性,当程序到达一个集合类型时,我希望它迭代集合的内容并能够访问集合中的对象.
目前,我在所有属性上都设置了属性,并且在集合属性上将IsCollection标志设置为true.我的代码检查此标志,如果是,则使用反射获取Type.有没有办法在某个集合上以某种方式调用GetEnumerator或Items才能迭代这些项目?
我有这个问题,但我没有使用反射,而是直接检查它是否是IEnumerable.所有的集合都实现了
if (item is IEnumerable) { foreach (object o in (item as IEnumerable)) { } } else { // reflect over item }
我尝试使用与Darren建议类似的技术,但请注意,不只是集合实现了IEnumerable.string
例如,也是IEnumerable,将迭代字符.
这是一个小函数,我用来确定一个对象是否是一个集合(由于ICollection也是IEnumerable,它也是可枚举的).
public bool isCollection(object o) { return typeof(ICollection).IsAssignableFrom(o.GetType()) || typeof(ICollection<>).IsAssignableFrom(o.GetType()); }
只需获取属性的值,然后将其转换为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