Отражение: чтение свойств типа List объекта, содержащего другой объект
Я пытаюсь сериализовать вложенные объекты с помощью отражения. Я могу сделать это нормально для свойств, содержащих одно значение, но у меня возникли проблемы со свойствами типа списка, которые содержат другой класс.
В приведенном ниже примере кода у меня есть класс Dish
который содержит список Recipe
классы как свойство, которое само содержит список Step
классы.
Я могу получить PropertyInfo
свойства List, но когда я пытаюсь получить его содержимое, вызывая метод get, я получаю простой объект, а не List, например, 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;}
}