反射:读取包含另一个对象的对象的列表类型属性

时间:2018-12-23 11:31:20

标签: c# list object reflection propertyinfo

我正在尝试使用反射序列化嵌套对象。对于包含单个值的属性,我可以做到这一点,但是对于包含另一个类的列表类型属性,我遇到了麻烦。

在下面的代码示例中,我有一个类Dish,该类包含作为属性的Recipe类的列表,它本身包含Step类的列表。

我能够获取List属性的PropertyInfo,但是当我尝试通过调用get方法获取其内容时,我得到了一个简单的对象,而不是例如List的列表。步骤:

var listObjects =  property.GetGetMethod().Invoke(dish, null);

我设法将其投射到这样的对象列表中:

List<object> listValues = ( listObjects as IEnumerable<object>).Cast<object>().ToList();

现在至少我可以遍历此List,但是我无法获得诸如步骤说明之类的原始类的附加属性。

所以我通过property.PropertyType.GenericTypeArguments.First()知道列表的类型,但是在运行时知道。我正在考虑如何执行正确的转换,以将我的List<object>转换为像List<Step>这样的具体类型。

我要实现的目标:序列化dish的所有属性值及其所有附加的对象列表。

我很感谢任何想法。

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var dish = new Dish(){
                 Recipes = new List<Recipe>(){
                           new Recipe(){
                               RecipeName = "Preparation", 
                               Steps = new List<Step>(){
                                       new Step(){
                                       Description = "Prepare Stuff",
                                       }
                               }
                           },
                           new Recipe(){
                           RecipeName = "Main Course",
                           Steps = new List<Step>(){
                                   new Step(){
                                      Description = "Do this",
                                   },
                                   new Step(){
                                      Description = "Then do that",
                                   }
                               }
                      }, }, };

        var serializer = new Serializer();
        serializer.SerializeDish(dish);
    }
}

public class Serializer
{
    public void SerializeDish(Dish dish)
    {
        var dishType = typeof (Dish);
        var listProps = dishType.GetProperties().Where(x => (x.PropertyType.IsGenericType && x.PropertyType.GetGenericTypeDefinition() == typeof (List<>)));
        foreach (var property in listProps)
        {
            var propertyGetMethod = property.GetGetMethod();
            var listObjects = propertyGetMethod.Invoke(dish, null);
            Console.WriteLine("Name:"+property.Name + " " + "List-Type:"+property.PropertyType.GenericTypeArguments.First());

            //Here its getting fuzzy
            List<object> listValues = ( listObjects as IEnumerable<object>).Cast<object>().ToList();
            foreach ( var item in listValues ) {
                Console.WriteLine(item);
            }
        }
    }
}

public class Dish
{
    public List<Recipe> Recipes {get;set;}
}

public class Recipe
{
    public string RecipeName{get;set;}
    public List<Step> Steps {get;set;}
}

public class Step
{
    public string Description {get;set;}
}

0 个答案:

没有答案