扩展方法和动态对象
我将总结我的问题到下面的代码片段。
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 }; Console.WriteLine(list.First());
上面的代码工作正常。
现在我尝试了以下
dynamic dList = list; Console.WriteLine(dList.First());
但我得到RuntimeBinderException.Why是这样吗?
扩展Stecya的答案扩展方法不支持动态类型的扩展方法的形式 ,即被称为如实例方法。 但是,这将工作:
dynamic dList = list; Console.WriteLine(Enumerable.First(dList));
当然,这可能会或可能不会有用。 如果您可以提供更多关于为什么以及如何尝试使用动态输入的信息,我们可能会提供更多的帮助。
为了扩展Jon的答案,这个不起作用的原因是因为在常规的非动态代码扩展方法中,通过对编译器已知的具有匹配扩展方法的静态类的所有类进行全面搜索。 搜索按照每个命名空间中的命名空间嵌套和可用using
指令的顺序进行。
这意味着为了获得正确解析的动态扩展方法调用,DLR必须在运行时知道所有命名空间嵌套和using
指令都在源代码中 。 我们没有将所有这些信息编码到呼叫站点的机制。 我们考虑制定这样一个机制,但是认为这个机制成本太高,产生太多的时间表风险是值得的。
因为First()
不是List
方法。 它在Linq扩展中定义为IEnumerable<>