我如何更改此代码段以正确添加 A
的实例到 List<A>
, B
到 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);
抛出异常是因为,Add()
被 Binder 找到,传入dynamic
无法解决重载问题。我希望不要更改以上内容以使用反射,或者至少将其最小化。我确实有权访问 System.Type
的实例对于每个 A
和 List<A>
.包含上述代码的类或方法本身不是通用的。
最佳答案
所有你需要的是使参数的绑定(bind)也动态 - 所以你只需要someChild
的类型是dynamic
:
dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);
在您之前的代码中,编译器会记住someChild
的编译时类型是object
,因此使用了编译器-time 类型而不是执行时间类型。执行时绑定(bind)器很聪明,只动态处理动态表达式以解决重载问题。
关于c# - 如何将 T 添加到 List<T> 中,其中 List<T> 伪装成 'dynamic' 而 T 伪装成 'object' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911564/