如何将T添加到List<T>中,其中List<T>伪装为“dynamic”,T伪装为“object”?

6

如何将此片段更改以正确地将 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,导致重载决议失败。我更倾向于 改变上述内容并使用反射,或者至少将其最小化。我可以访问每个 AList<A>System.Type 实例。包含上述代码的类或方法本身不是泛型。
2个回答

2

您需要做的就是使参数绑定也变得动态化 - 所以您只需要将someChild的类型设置为dynamic

dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);

在您之前的代码中,编译器会记住someChild的编译时类型是object,因此使用该编译时类型而不是执行时类型。执行时绑定器在重载解析时只能聪明地将动态表达式作为动态处理。

1

Jon是对的,所以我接受了他的观点,但我自己也有健忘的问题,就是List<T>实现了IList(非泛型版本):

object someChild = GetObject();
var list = (IList)GetListFromSomewhere(...);
list.Add(somechild);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接