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

时间:2012-01-18 14:12:54

标签: c# dynamic collections casting

如何更改此代码段以将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.TypeA中的每一个访问List<A>的实例。包含上述代码的类或方法本身并不通用。

2 个答案:

答案 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);