如何将T添加到List <T>,其中List <T>伪装成'dynamic'而T为'object'?

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>.包含上述代码的类或方法本身不是通用的.

Jon*_*eet 2

您所需要的就是使参数的绑定也动态化 - 所以您只需要类型someChilddynamic

dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);
Run Code Online (Sandbox Code Playgroud)

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