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

标签 c# dynamic collections casting

我如何更改此代码段以正确添加 A 的实例到 List<A> , BList<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 的实例对于每个 AList<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/

相关文章:

c# - 从 C#.NET 应用程序调用 MS Access 中的 VBA 代码

c# - 破译触发事件的控件

c# - C# 中的 Word 自动化语法

javascript - 动态加载的元素不在 HTML 源代码中

Python:基于 __init__ 值以编程方式创建子类

java - 迭代除第一个元素之外的列表的首选方法

java - 如何在scala中将java列表转换为数组?

c# - 在 asp.net 中异步运行方法

javascript - enquire.js - 如何在动态创建的寄存器函数中维护变量?

java - treemap vs hashmap 并根据内存使用情况进行排序