首页 > 解决方案 > 扩展方法和动态变量

问题描述

动态变量是否有理由不支持扩展方法?有没有办法绕过它?

这是一个例子:

我没有忘记包含我正在使用的扩展方法的类的 using 指令:

using System.Linq;

此代码可以正常工作:

IEnumerable<string> ie = new HashSet<string>() { "test" };
Console.WriteLine(ie.ToList()[0]);

这个抛出一个异常:

IEnumerable<string> ie = new HashSet<string>() { "test" };
Console.WriteLine(((dynamic)ie).ToList()[0]);

''System.Collections.Generic.HashSet' 不包含 'ToList' 的定义'

标签: c#.netdynamicextension-methods

解决方案


ToListLinq 需要一个编译时间- IEnumerable。通过使用dynamic,您完全隐藏了编译时类型,并使编译器无法推断出正确的方法。所以你依赖运行时绑定。

现在扩展方法只是方法的语法糖static

static class Enumerable
{
    public static List<T> ToList(IEnumerable<T> e) { ...}
}

你会这样称呼它:

Enumerable.ToList(myHashSet);

这也是编译器所做的。它将所有调用转换hashSet.ToList()Enumerable.ToList(hashSet).

此方法与您的实际类(哈希集)无关,因为扩展方法不会修改现有类。他们只是定义看起来像是被添加到类中的方法。或者换句话说:在运行时 - 这dynamic是评估的时间 - 没有这样的方法HashSet.ToList,但是Enumerable.ToList.


推荐阅读