我有一个具有泛型List属性的对象,其中T是基元值、字符串或枚举。此列表的泛型参数永远不会是引用类型(字符串除外)。现在,我有另一个List,它的参数类型是object。有没有办法用我的对象列表设置该属性的值?如:
List<object> myObjectList = new List<object>();
myObjectList.Add(5);
property.SetValue(myObject, myObjectList, null);
当我知道房产的真实类型是:
List<int>
我能看到的唯一解决方案是制作一个硬编码开关,该开关使用list属性的泛型参数类型并创建一个类型安全列表。但最好是有一个通用的解决方案。谢谢
如果您知道它确实是某些T
的List<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);
是的,你可以这样做:
property.SetValue(myObject, myObjectList.Cast<int>().ToList(), null);
这是在使用Enumerable.Cast
,所以请注意,如果列表中有非int
类型的值,这将引发运行时异常。