构造类 - c#枚举方法




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

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

非常感谢。


喜欢这个:

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);

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


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

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





extension-methods