我有一个带有通用List属性的对象,其中T是原始值,字符串或枚举。此列表的泛型参数永远不会是引用类型(字符串除外)。现在,我有另一个List的参数类型是对象。有没有办法用我的对象列表设置该属性的值?如:
List<object> myObjectList = new List<object>();
myObjectList.Add(5);
property.SetValue(myObject, myObjectList, null);
当我知道该物业的真实类型是:
List<int>
我能看到的唯一解决方案是制作一个硬编码开关,它使用通用参数的list属性类型并创建一个类型安全列表。但如果有一般案例解决方案,那将是最好的。谢谢!
答案 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
,则会抛出运行时异常。