如何在反射中最好地检查List类型并迭代其成员

时间:2014-03-03 16:35:23

标签: c# reflection

我正在使用反射来获取特定对象的所有属性并迭代它们。

我正在调用这些属性props

当这些是非List对象时,一切正常。

我需要一种方法来知道我迭代的道具是什么时候是一个列表(例如,我看到有一个prop.PropertyType.IsArray,但不是列表中的一个。)

我在这里看到Determine if a property is a kind of array by reflection他们建议使用:

property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null

但是这对我来说还不够好,因为string也实现了这一点。

(现在我正在检查prop.Namespace中是否包含“集合”,显然正在寻找更好的方法。

在我完成之后,我有一个工作假设,List将是一个复杂对象的List。 (但可能是几个复杂的对象中的一个,所以我不知道哪个)

更难的部分是我需要迭代这些对象并获得 他们的 成员,但未能这样做。

因此,如果我List<TestObject>prop,我需要以某种方式(概念上)foreach (TestObject testObj in prop)

没有合理的尝试在这里显示,因为我还没有找到一种方法将prop视为我的复杂对象的列表并迭代它。

编辑:我已设法通过prop.GetValue(reflectedObject)获得价值,但我必须将其转换为List<MyComplexObject>

2 个答案:

答案 0 :(得分:0)

我认为使用IEnumerable<>界面实际上是前进的方向。你有什么类型的基础类型的对象?如果是,那么您可以解决string的问题,寻找扩展基类型的对象集合。如果不是,那么在检查IEnumerable<>接口之前,您可以将字符串视为特殊情况。

答案 1 :(得分:0)

我认为调查此代码示例可以提供帮助。

public class MyClass
{
    public string Name { get; set; }
    public int Id { get; set; }
    public List<int> Subordinates { get; set; }
}

使用MyClass:

var myClass = new MyClass
{
    Id = 1,
    Name = "My Name",
    Subordinates = new List<int> { 2, 5, 8 }
};

var props = myClass.GetType().GetProperties();
foreach (var info in props)
{
    var type = info.PropertyType;

    if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(List<>)))
    {
        foreach (var listitem in info.GetValue(myClass, null) as IEnumerable)
        {
            Console.WriteLine("Item: " + listitem.ToString());
        }

        continue;
    }
    Console.WriteLine(info.GetValue(myClass, null));
}