如何调用动态类型的扩展方法?

时间:2011-03-11 08:49:33

标签: c# dynamic extension-methods

我正在读Jon Skeet的书“C#in Depth,2nd Edition”。他说我们可以使用两个变通方法调用带有动态参数的扩展方法,就像

一样
dynamic size = 5;
var numbers = Enumerable.Range(10, 10);
var error = numbers.Take(size);
var workaround1 = numbers.Take((int) size);
var workaround2 = Enumerable.Take(numbers, size);

然后他说“如果你想用动态值作为隐式this值调用扩展方法,两种方法都会有效”。我不知道如何实现它。

非常感谢。

2 个答案:

答案 0 :(得分:40)

像这样:

dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);

换句话说,只需将其称为静态方法而不是扩展方法。

if 如果你知道一个合适的类型参数你可以把它投出来,我通常会用一个额外的变量来做:

dynamic numbers = Enumerable.Range(10, 10);
var sequence = (IEnumerable<int>) numbers;
var firstFive = sequence.Take(5);

...但是如果你正在处理动态类型,你可能不知道序列元素类型,在这种情况下,第一个版本让“执行时编译器”基本上解决它。

答案 1 :(得分:3)

扩展方法只是一个语法糖,它将被转换为c#编译器调用的普通方法。此转换依赖于当前语法上下文(使用语句导入哪些名称空间)。

动态变量是运行时的过程。这次,CLR无法获得足够的语法上下文信息来决定使用哪种扩展方法。所以,它不起作用。