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