c# - 扩展方法和动态变量
问题描述
动态变量是否有理由不支持扩展方法?有没有办法绕过它?
这是一个例子:
我没有忘记包含我正在使用的扩展方法的类的 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' 的定义'
解决方案
从ToList
Linq 需要一个编译时间- 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
.
推荐阅读
- php - Authorize.Net 中的定期计费
- python - How to add/ modify/ patch altair chart data dynamically?
- excel - VBA无限嵌套for循环
- python - 使用python解决子集问题的变量动态编程范围
- java - 在 Thread.onSpinWait() 期间 CPU 使用率为 100%
- python - Python多进程和多线程或单个函数花费相同的时间
- mysql - 列出部门id、部门名称和每个部门的经理人数
- r - 对特定周的第一个和最后一个日期进行分组
- python - Python中的结构模式匹配
- python-3.x - EOFError:使用 Python 时输入不足