扩展方法和动态变量
Extension methods & dynamic vars
动态变量不支持扩展方法有什么原因吗?有什么办法可以避免吗?
这里有一个例子:
我没有忘记 class 的 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' does not contain a definition for 'ToList''
Linq 的 ToList
需要 编译时间 -IEnumerable
。通过使用 dynamic
您可以完全隐藏编译时类型并使编译器无法推断出正确的方法。所以你依赖于运行时绑定。
现在扩展方法只是 static
方法的语法糖:
static class Enumerable
{
public static List<T> ToList(IEnumerable<T> e) { ...}
}
你可以这样称呼它:
Enumerable.ToList(myHashSet);
编译器也是这样做的。它将所有对 hashSet.ToList()
的调用转换为 Enumerable.ToList(hashSet)
。
此方法与您实际的 class - 哈希集 - 无关,因为扩展方法不会 修改 现有的 classes。他们只是定义了 看起来 就像将它们添加到 class 中一样的方法。或者换句话说:在运行时 - 这是评估 dynamic
的时候 - 没有这样的方法 HashSet.ToList
,但是 Enumerable.ToList
.
动态变量不支持扩展方法有什么原因吗?有什么办法可以避免吗?
这里有一个例子:
我没有忘记 class 的 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' does not contain a definition for 'ToList''
Linq 的 ToList
需要 编译时间 -IEnumerable
。通过使用 dynamic
您可以完全隐藏编译时类型并使编译器无法推断出正确的方法。所以你依赖于运行时绑定。
现在扩展方法只是 static
方法的语法糖:
static class Enumerable
{
public static List<T> ToList(IEnumerable<T> e) { ...}
}
你可以这样称呼它:
Enumerable.ToList(myHashSet);
编译器也是这样做的。它将所有对 hashSet.ToList()
的调用转换为 Enumerable.ToList(hashSet)
。
此方法与您实际的 class - 哈希集 - 无关,因为扩展方法不会 修改 现有的 classes。他们只是定义了 看起来 就像将它们添加到 class 中一样的方法。或者换句话说:在运行时 - 这是评估 dynamic
的时候 - 没有这样的方法 HashSet.ToList
,但是 Enumerable.ToList
.