首页 > 解决方案 > 如何使用反射获取另一个对象内的对象列表

问题描述

使用反射,我可以获得所有数据类型的对象属性和值以及该对象内的对象。但是,如果该对象包含其他对象的列表,我将无法获取列表中的对象。该列表可以包含任何类型的对象。

private static void SaveObj(object obj) {
   foreach (var prop in obj.GetType().GetProperties()) {
       if (prop.PropertyType.Namespace == "Entities") { //It is an object
           object obL = prop.GetValue(obj, null);
           SaveObj(obj);
       }
       else if (prop.PropertyType.Name == "List`1") { //This is a list of objects
           object obP = prop.GetValue(obj); 
           //obP has the list of objects, I can see the list in debug mode.
           List<object> obL = (List<object>)prop.GetValue(obj, null);
           //This line returns an exception!!
       }
       else {
           columns += prop.Name.ToLower() + ", ";
           values[i] = prop.GetValue(obj, null).ToString();
       }
       ... // the code continues ...
   }
}     

返回的异常消息是:“无法转换 'System.Collections.Generic.List 1[Entities.OrderItem]' to type 'System.Collections.Generic.List1[System.Object]' 类型的对象。”

有趣的是,我可以在 degu 模式下查看所有对象及其内容。在即时窗口中,我可以打印带有列表中所有对象的变量 obP 的内容,但是如何读取它们呢?

关于如何解决这个问题的任何想法?

标签: c#.netreflection

解决方案


您可以尝试将其转换为IEnumerable然后使用.Cast<object>().ToList()如下所示:

IEnumerable obL = prop.GetValue(obj, null) as IEnumerable;
List<object> list = obL.Cast<object>().ToList();

推荐阅读