C#如何在类型为List <t>时设置PropertyInfo值,并且我有一个List <object> </object> </t>

时间:2014-09-10 04:04:52

标签: c# generics reflection collections casting

我有一个带有通用List属性的对象,其中T是原始值,字符串或枚举。此列表的泛型参数永远不会是引用类型(字符串除外)。现在,我有另一个List的参数类型是对象。有没有办法用我的对象列表设置该属性的值?如:

List<object> myObjectList = new List<object>();
myObjectList.Add(5);

property.SetValue(myObject, myObjectList, null);

当我知道该物业的真实类型是:

List<int>

我能看到的唯一解决方案是制作一个硬编码开关,它使用通用参数的list属性类型并创建一个类型安全列表。但如果有一般案例解决方案,那将是最好的。谢谢!

2 个答案:

答案 0 :(得分:4)

你应该创建一个属性真实类型的实例,如果你知道它对于某些List<T>(而不是一个接口)确实是T。然后,您可以转换为IList并将值添加到该值,而不知道实际类型。

object instance = Activator.CreateInstance(property.PropertyType);
// List<T> implements the non-generic IList interface
IList list = (IList) instance;
list.Add(...); // Whatever you need to add

property.SetValue(myObject, list, null);

答案 1 :(得分:2)

是的 - 您可以这样做:

property.SetValue(myObject, myObjectList.Cast<int>().ToList(), null);

这是使用Enumerable.Cast所以请注意,如果列表中的值类型不是int,则会抛出运行时异常。