TL; DR
我一直坚持使用反射来初始化List<T>
和元素。
说明
我正在尝试使用反射以编程方式初始化整个导出类。
该类包含很多子类和列表。
此功能的目的是快速生成XML导出的填充类。
你可能会问,为什么我要使用反射,这是因为我有很多不同种类的巨大类。
仅仅为了测试目的而将它们全部写出来将是一件痛苦的事情。
代码(58行)
public static object Populate(object object_Orginal)
{
PropertyInfo[] PropertyInfos = object_Orginal.GetType().GetProperties();
for (int iIndex = 0; iIndex < PropertyInfos.Length; iIndex++)
{
PropertyInfo PropertyInfo_Tmp = PropertyInfos[iIndex];
if (PropertyInfo_Tmp.GetSetMethod() == null)
{
continue;
}
// Is it right to exclude them?
if (PropertyInfo_Tmp.Name == "Capacity" || PropertyInfo_Tmp.Name == "Count")
{
continue;
}
Type Type_Tmp = PropertyInfo_Tmp.PropertyType;
if (Type_Tmp == typeof(int))
{
PropertyInfo_Tmp.SetValue(object_Orginal, 1);
}
// [...] a few more basic types
// >>> Here I'm completly stuck - and yea it's a mess
else if (Type_Tmp.Name == "List`1") // typeof(List<>))
{
object list = Activator.CreateInstance(Type_Tmp);
MethodInfo add = Type_Tmp.GetMethod("Add");
IEnumerable<Attribute> a = PropertyInfo_Tmp.GetCustomAttributes();
PropertyInfo[] propertyInfo = list.GetType().GetProperties();
foreach (PropertyInfo property in propertyInfo)
{
object d = Populate(property);
property.SetValue(list, d);
}
//foreach (Attribute item in a)
//{
// add.Invoke(list, new object[] { Populate(item) });
//}
//add.Invoke(list, new[] { item });
//prop.SetValue(x, list, null);
}
// <<<
else
{
ConstructorInfo ConstructorInfo_Property = Type_Tmp.GetConstructor(Type.EmptyTypes);
object object_Property = ConstructorInfo_Property.Invoke(new object[0]);
object_Property = Populate(object_Property);
PropertyInfo_Tmp.SetValue(object_Orginal, object_Property);
}
}
return object_Orginal;
}
here的原始代码
我尝试了few different的方法,但是无法正确实现。
主要目标是初始化List<T>
,然后在列表中添加一个或多个项目,然后递归初始化它们。
答案 0 :(得分:1)
通过查看您的代码,我假设您的T类是具有所有属性的默认构造函数和设置方法的简单DTO? 尝试Objectfiller,它似乎可以满足您的要求:
ObjectFiller.NET将帮助您使用 有意义但随机的数据。您将永远不必填补自己的复杂事物 手工创建类层次结构-ObjectFiller.NET将为您做到这一点!
,并且还可以填充IEnumerable,将其转换为列表很简单