gpt4 book ai didi

c# - 将任何 IEnumerable 分配给对象属性

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:23 25 4
gpt4 key购买 nike

我有一个使用反射创建的对象列表,它们都是相同的类型,但是在编译时类型是未知的。

我正在尝试找出将此列表(也使用反射)分配给可以是任何 IEnumerable 的对象属性的最佳方法。

List<object>
ArrayList
Custom : List<object>

我唯一的方法是假设该属性是一个 ICollection,然后遍历 IEnumerable 并添加每个项目。 (见下文,其中 list 是 IEnumerable 源,key 是对象属性的字符串名称,result 是对象本身)

foreach (object item in list) {
PropertyInfo prop = result.GetType().GetProperty(key);
var collection = prop.GetValue(result, null);

Type collectionType = collection.GetType();
MethodInfo add = collectionType.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance);

add.Invoke(collection, new object[] { item });
}

最佳答案

既然你说数据是同质的,我会建议尽可能接近地输入它;所以假设 list 是非空的,list[0].GetType() 将告诉您所有数据的 Type。此时,您可以:

IList typedList = (IList)Activator.CreateInstance(
typeof(List<>).MakeGenericType(itemType));
...
foreach(var item in list) typedListAdd(item);

或者你可以使用数组:

Array arr = Array.CreateInstance(itemCount, list.Count);
list.CopyTo(arr, 0);

其中任何一个都会为您提供一个类型良好的列表,对于大多数用途(数据绑定(bind)、序列化或只是反射)来说,它往往会工作得更好。

如果 list 实际上不是 list,而只是 IEnumerable,那么您基本上仍然可以同样的事情,但只是将创建推迟到第一个项目:

IList typedList = null;
foreach(object item in list) {
if(typedList == null) {
typedList = (IList)Activator.CreateInstance(
typeof(List<>).MakeGenericType(item.GetType()));
}
typedList.Add(item);
}
return typedList ?? new object[0];

关于c# - 将任何 IEnumerable 分配给对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18251587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com