我有一个使用反射创建的对象列表,它们都是相同的类型,但是类型在编译时未知。
我想弄清楚best将此列表(也使用反射)分配给对象属性的方法可以是anyIE可数。
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);
其中任何一个都会给你一个打字好list,对于大多数用途(数据绑定、序列化或只是反射)来说,它往往效果更好。
If 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];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)