【问题标题】:How to call an extension method of a dynamic type?如何调用动态类型的扩展方法?
【发布时间】:2011-03-11 08:49:32
【问题描述】:

我正在阅读 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 值调用扩展方法,这两种方法都可以工作”。我不知道如何实现它。

非常感谢。

【问题讨论】:

  • 伙计,现在不就是门票吗?你读了 Jon Skeet 的书,并从 Jon Skeet 那里得到了关于你不清楚的问题的答案。

标签: c# dynamic extension-methods


【解决方案1】:

像这样:

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

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

【讨论】:

  • 大概你可以这样做: ((IEnumerable)numbers).Take(5) ?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多