扩展方法和动态对象

时间:2011-03-15 12:08:25

标签: c# dynamic c#-4.0

我将把我的问题汇总到以下代码片段中。

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());

以上代码工作正常。

现在我尝试了以下

dynamic dList = list;
 Console.WriteLine(dList.First());

但是我得到RuntimeBinderException。为什么会这样?

3 个答案:

答案 0 :(得分:129)

为了扩展Jon的答案,之所以不起作用,是因为在常规的非动态代码扩展方法中,通过对编译器已知的所有类进行完全搜索来处理具有扩展方法的静态类。匹配。搜索按顺序进行,基于命名空间嵌套和每个命名空间中的可用using指令。

这意味着为了正确解析动态扩展方法调用,DLR必须在某种程度上知道在运行时所有命名空间嵌套和using指令是 in您的源代码。我们没有将所有信息编码到呼叫站点中的机制。我们考虑发明这样一种机制,但认为它的成本太高,并且产生太多的进度风险值得。

答案 1 :(得分:121)

要扩展Stecya的答案......动态类型以扩展方法的形式不支持扩展方法,即称为它们是实例方法。但是,这将有效:

dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));

当然,这可能有用也可能没用。如果您可以提供有关您尝试使用动态类型的原因和方式的更多信息,我们可以提供更多帮助。

答案 2 :(得分:18)

因为First()不是List的方法。它在Linq Extension中定义为IEnumerable<>