我正在尝试使用反射序列化嵌套对象。对于包含单个值的属性,我可以做到这一点,但是对于包含另一个类的列表类型属性,我遇到了麻烦。
在下面的代码示例中,我有一个类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;}
}