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)
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)
只需获取属性的值,然后将其转换为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)
| 归档时间: |
|
| 查看次数: |
31499 次 |
| 最近记录: |