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

Kir*_*Yao 24 c# extension-methods dynamic

我正在读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);
Run Code Online (Sandbox Code Playgroud)

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

非常感谢.

Jon*_*eet 41

像这样:

dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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