如何使用反射初始化List <T>和元素?

时间:2019-08-21 09:54:08

标签: c# list reflection system.reflection

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>,然后在列表中添加一个或多个项目,然后递归初始化它们。

1 个答案:

答案 0 :(得分:1)

通过查看您的代码,我假设您的T类是具有所有属性的默认构造函数和设置方法的简单DTO? 尝试Objectfiller,它似乎可以满足您的要求:

  

ObjectFiller.NET将帮助您使用   有意义但随机的数据。您将永远不必填补自己的复杂事物   手工创建类层次结构-ObjectFiller.NET将为您做到这一点!

,并且还可以填充IEnumerable,将其转换为列表很简单