如何更改此代码段以将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()
时,它会传入dynamic
,这会导致重载解析失败。我更喜欢 not 更改上面的内容以使用反射,或者至少将其最小化。我可以为System.Type
和A
中的每一个访问List<A>
的实例。包含上述代码的类或方法本身并不通用。
答案 0 :(得分:2)
您所需要的只是使参数的绑定动态化 - 所以您只需要someChild
的类型为dynamic
:
dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);
在您之前的代码中,编译器将记住,someChild
的编译时类型为object
,因此使用了编译时类型而不是执行时间类型。执行时绑定器非常智能,只能动态处理动态表达式以进行重载解析。
答案 1 :(得分:1)
Jon是对的所以我接受了这一点,但也有我自己的遗忘List<T>
实现IList
(非通用版本):
object someChild = GetObject();
var list = (IList)GetListFromSomewhere(...);
list.Add(somechild);