Kit*_*Kit 6 c# collections casting dynamic
如何更改此代码段以正确添加Aa List<A>,Ba List<B>等实例?
// 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);
Run Code Online (Sandbox Code Playgroud)
引发异常的原因是,当Add()绑定器找到它时,它会传递dynamic失败的重载决策.我不想改变上面的内容来使用反射,或者至少减少它.我有权访问System.Type每个A和的实例List<A>.包含上述代码的类或方法本身不是通用的.
您所需要的就是使参数的绑定也动态化 - 所以您只需要类型someChild为dynamic:
dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);
Run Code Online (Sandbox Code Playgroud)
在之前的代码中,编译器会记住的编译时类型是someChild,object因此使用该编译时类型而不是执行时类型。执行时绑定器很聪明,只动态处理动态表达式以进行重载解析。
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |