C#4 中的 dynamic 关键字是不是支持扩展方法?

Posted

技术标签:

【中文标题】C#4 中的 dynamic 关键字是不是支持扩展方法?【英文标题】:Will the dynamic keyword in C#4 support extension methods?C#4 中的 dynamic 关键字是否支持扩展方法? 【发布时间】:2008-11-03 15:28:58 【问题描述】:

我是 listening to a talk 关于 C#4dynamic 关键字,我想知道...此功能是否会与其他 .NET 功能正交,例如它是否支持扩展方法?

public static class StrExtension 
    public static string twice(this string str)  return str + str; 

...
dynamic x = "Yo";
x.twice(); // will this work?

注意:这个问题是在 C#4 发布之前提出的,这就是为什么它用将来时来表达。

【问题讨论】:

很棒的问题。我的猜测是“否”,因为它们实际上并不是课程的一部分,也不能通过反射获得。 我也猜“不”。但我认为这会起作用: var x = "Y0"; x.twice(); 乔尔,这一切都已经开始工作了。改变它将是一个重大的改变 【参考方案1】:

来自"New Features in C# 4" word doc:

动态查找将无法 查找扩展方法。无论 扩展方法是否适用取决于 关于调用的静态上下文 (即出现哪些 using 子句),以及 此上下文信息不是 目前作为有效载荷的一部分保存。

【讨论】:

嗯,这很奇怪......这突然从三个答案变成了一个。我想当我删除我的错误答案时,另一个人删除了他的“不太正确的答案”...... jon,简而言之(只是为了理解)动态不支持扩展方法的确切原因是什么? @RoyiNamir 扩展方法的魔力似乎是编译时构造。在运行时,C# 并没有携带它可以在命名空间中找到的每个扩展方法的状态,这是一个性能问题。【参考方案2】:

至少我觉得这很有趣……

public static class StrExtension

   public static string twice(this string str)  return str + str; 


...
dynamic x = "Yo";
StrExtension.twice(x);

不过,如果编译器可以在编译时找到正确的扩展方法,那么我不明白为什么它不能打包一组扩展方法以便在运行时查找?它就像一个用于非成员方法的 v-table。

编辑:

这很酷...http://www2.research.att.com/~bs/multimethods.pdf

【讨论】:

你正在调用一个静态类并给它一个字符串......这应该总是有效的:) 当您传递的字符串是 POCO 对象上的动态属性时,这实际上不起作用【参考方案3】:

它不能工作,扩展方法的工作取决于文件中包含的命名空间,据我所知,MSIL 不知道文件和包括命名空间。

【讨论】:

【参考方案4】:

您可以为object创建一个扩展方法并将其分配给一个动态

public static void MyExt(this object o) 
    dynamic d = o;
    d.myProp = "foo";

然后这样称呼它:

ClassWithMyProp x;
x.MyExt();

【讨论】:

以上是关于C#4 中的 dynamic 关键字是不是支持扩展方法?的主要内容,如果未能解决你的问题,请参考以下文章

VB 2010 中的 Object 是不是获得了与 C# 4.0 中的动态相同的优化?

C# 动态语言扩展(11)

Dart语言关键词之dynamic

Dynamic Pivot 中的列不会在下一个关键项目处重新开始

c语言sum是啥意思

C++中的new/delete构造/析构函数dynamic_cast分析