【问题标题】:How to add a T to List<T> where List<T> masquerades as 'dynamic' and T as 'object'?如何将 T 添加到 List<T> 其中 List<T> 伪装成“动态”而 T 伪装成“对象”?
【发布时间】:2012-02-13 06:09:44
【问题描述】:

如何更改此 sn-p 以正确地将 A 的实例添加到 List&lt;A&gt;BList&lt;B&gt; 等?

// someChild's actual type is A
object someChild = GetObject();
// collection's actual type is List<A> though method below returns object
dynamic list = GetListFromSomewhere(...);
// code below throws a RuntimeBinderException
list.Add(somechild);

抛出异常是因为,虽然 Add() 被绑定程序找到,但它传入了 dynamic,这导致重载解析失败。我更喜欢 not 将上述内容更改为使用反射,或者至少将其最小化。对于AList&lt;A&gt;,我确实可以访问System.Type 的实例。包含上述代码的类或方法本身不是泛型的。

【问题讨论】:

    标签: c# dynamic collections casting


    【解决方案1】:

    您所需要的只是使参数的绑定也是动态的 - 所以您只需要将 someChild 的类型设为 dynamic

    dynamic someChild = GetObject();
    dynamic list = GetListFromSomewhere(...);
    list.Add(somechild);
    

    在您之前的代码中,编译器会记住someChild 的编译时类型是object,因此使用该编译时类型而不是执行时类型.执行时绑定器很聪明,只动态处理动态表达式以解决重载问题。

    【讨论】:

      【解决方案2】:

      Jon 是对的,所以我接受了这一点,但我自己也忘记了 List&lt;T&gt; 实现 IList(非通用版本):

      object someChild = GetObject();
      var list = (IList)GetListFromSomewhere(...);
      list.Add(somechild);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-12
        • 2019-11-08
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多