Отражение: чтение свойств типа List объекта, содержащего другой объект - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь сериализовать вложенные объекты, используя отражение.Я могу сделать это нормально для свойств, содержащих одно значение, но у меня возникают проблемы со свойствами типа списка, которые содержат другой класс.

В приведенном ниже примере кода у меня есть класс Dish, который содержит списокиз Recipe классов как свойства, которое само содержит список Step классов.

Я могу получить PropertyInfo свойства List, но когда я пытаюсь получить содержимоевызывая метод get, я получаю простой объект, а не список, например, Steps:

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

Мне удалось преобразовать это в список объектов следующим образом:

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

Теперь, по крайней мере, я могу перебрать этот Список, но я не могу получить точные свойства исходных классов, такие как описание шага.

Так что я знаю тип Списка через 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;}
}
...