当前位置:  开发笔记 > 编程语言 > 正文

通过反思访问集合

如何解决《通过反思访问集合》经验,为你挑选了3个好方法。

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

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



1> Darren Kopp..:

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

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

    }
} else {
   // reflect over item
}


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

2> Nagyman..:

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

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

    public bool isCollection(object o)
    {
        return typeof(ICollection).IsAssignableFrom(o.GetType())
            || typeof(ICollection<>).IsAssignableFrom(o.GetType());
    }



3> jop..:

只需获取属性的值,然后将其转换为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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有