【问题标题】:How to best check for List type on reflection and iterate over its members如何在反射中最好地检查 List 类型并迭代其成员
【发布时间】:2014-03-04 01:05:24
【问题描述】:

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

我将这些属性称为props

当那些是非列表对象时,这一切都很好。

我需要一种方法来知道我正在迭代的道具何时是一个列表(例如,我看到有一个 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>

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    我认为查看此代码示例会有所帮助。

    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));
    }
    

    【讨论】:

      【解决方案2】:

      我认为使用IEnumerable&lt;&gt; 接口实际上是前进的方向。你的对象有某种基本类型吗?如果是,那么您可以使用string 来解决该问题,以寻找扩展基本类型的对象集合。如果不是,那么您可以在检查IEnumerable&lt;&gt; 接口之前将字符串视为特殊情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多