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

C# 如何调用动态类型的扩展方法?,c#,dynamic,extension-methods,C#,Dynamic,Extension Methods,我正在读乔恩·斯凯特的《深入C#Depth,第二版》。他说,我们可以使用两种变通方法调用带有动态参数的扩展方法,就像 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); 然后他说:“

我正在读乔恩·斯凯特的《深入C#Depth,第二版》。他说,我们可以使用两种变通方法调用带有动态参数的扩展方法,就像

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
值,那么这两种方法都会起作用。”。我不知道如何实现它

非常感谢。

像这样:

dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);
换句话说,只需将其作为静态方法而不是扩展方法调用即可

或者,如果您知道一个合适的类型参数,您可以将其强制转换,我通常会使用一个额外的变量:

dynamic numbers = Enumerable.Range(10, 10);
var sequence = (IEnumerable<int>) numbers;
var firstFive = sequence.Take(5);
动态数=可枚举范围(10,10);
变量序列=(IEnumerable)数;
var firstFive=序列。取(5);

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

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


动态变量由运行时处理。这一次,CLR无法获得足够的语法上下文信息来决定使用哪个扩展方法。所以,这是行不通的。

大概你可以这样做:((IEnumerable)数字)。拿(5)?伙计,这不就是票吗?你读了Jon Skeet的一本书,从Jon Skeet那里得到了关于你不清楚的事情的答案。