【问题标题】:C# How to set PropertyInfo value when its type is a List<T> and I have a List<object>C#当它的类型是 List<T> 并且我有一个 List<object> 时如何设置 PropertyInfo 值
【发布时间】:2014-11-03 14:42:05
【问题描述】:

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

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

property.SetValue(myObject, myObjectList, null);

当我知道该属性的真实类型是:

List<int>

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

【问题讨论】:

  • 嗯,5 不是字符串。当 T 是字符串时它应该如何表现?
  • 将值添加到列表的方式是使用 Convert.ChangeType(value, typeof(underlyingGenericValue)) 在 Try-Catch 块内,如果尝试失败,则将值设置为默认值使用 Activator 创建实例的类型。

标签: c# generics reflection collections casting


【解决方案1】:

是的,你可以这样做:

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

这是使用Enumerable.Cast,因此请注意,如果列表中没有int 类型的值,这将引发运行时异常。

【讨论】:

    【解决方案2】:

    你应该创建一个属性的真实类型的实例,如果你知道它真的会是一个List&lt;T&gt; 对于一些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);
    

    【讨论】:

    • 很好,但缺少关于如何实现设置嵌套列表的说明。例如 MyObject.MyList[0].SecondList[1].SomeValue
    • @Best_Where_Gives:我不清楚你在问什么,或者它与实际提出的问题有什么关系。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2013-08-29
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多