如何在编译时创建List并通过System.Reflection.PropertyInfo复制项目

本文关键字:System Reflection 项目 复制 PropertyInfo 类型 编译 创建 unknown List | 更新日期: 2023-09-27 17:52:58

我遇到了一些相当复杂的事情。如果有人能帮忙,我将不胜感激。

1)我必须在编译时创建未知类型的List<>。我已经做到了。

 Type customList = typeof(List<>).MakeGenericType(tempType);
 object objectList = (List<object>)Activator.CreateInstance(customList);

"temptype"是已经获取的自定义类型。

2)现在我有了PropertyInfo对象它是一个列表,我必须从中复制所有项目到我刚刚创建的实例"objectList"

3)然后我需要迭代并访问"objectList"中的项,就好像它是一个"System.Generic.List"。

长话短说,使用反射,我需要提取一个属性,这是一个列表,并有它作为一个实例,以供进一步使用。您的建议将不胜感激。提前感谢。

Umair

如何在编译时创建List<unknown类型>并通过System.Reflection.PropertyInfo复制项目

许多. net泛型集合类也实现了它们的非泛型接口。我会利用这些来写你的代码。

// Create a List<> of unknown type at compile time.
Type customList = typeof(List<>).MakeGenericType(tempType);
IList objectList = (IList)Activator.CreateInstance(customList);
// Copy items from a PropertyInfo list to the object just created
object o = objectThatContainsListToCopyFrom;
PropertyInfo p = o.GetType().GetProperty("PropertyName");
IEnumerable copyFrom = p.GetValue(o, null);
foreach(object item in copyFrom) objectList.Add(item); // Will throw exceptions if the types don't match.
// Iterate and access the items of "objectList"
// (objectList declared above as non-generic IEnumerable)
foreach(object item in objectList) { Debug.WriteLine(item.ToString()); }

你觉得这会对你有帮助吗?从另一个集合更新一个集合的有效方法

我想到了一些类似的东西。我从NullSkull借用了SetProperties()方法,并编写了一个简单的方法,调用NullSkull SetProperties():

    public static List<U> CopyList<T, U>(List<T> fromList, List<U> toList)
    {
        PropertyInfo[] fromFields = typeof(T).GetProperties();
        PropertyInfo[] toFields = typeof(U).GetProperties();
        fromList.ForEach(fromobj =>
        {
            var obj = Activator.CreateInstance(typeof(U));
            Util.SetProperties(fromFields, toFields, fromobj, obj);
            toList.Add((U)obj);
        });
        return toList;
    }

…因此,使用一行代码,我可以检索List<source class>中按名称填充匹配值的List<desired class>,如下所示:

List<desired class> des = CopyList(source_list, new List<desired class>());

就性能而言,我没有测试它,因为我的需求需要小列表。