C#4:dynamictypes的实例

我想我已经把自己的大脑半路包裹在了C#4中的dynamictypes概念中,但是不能为我的生活找出一个我真正想要使用它的场景。

我确定有很多,但我只是无法build立连接,以便如何devise一个解决scheme,更好地解决dynamic问题,而不是接口,dependency injection等。

那么,什么是dynamictypes使用适合的真实应用场景呢?

有很多情况下,您现在已经在使用dynamictypes和dynamic绑定 。 你只是没有意识到这一点,因为它隐藏在string或System.Object后面,因为直到C#4,没有必要的支持。

一个例子是COM互操作:COM实际上是一个半dynamic的对象系统。 当你做COM互操作的时候,很多方法实际上会返回一个dynamic对象,但是因为C#不支持它们,所以它们被作为System.Object返回,你必须自己抛出它们,可能会捕获exception。

另一个例子是与dynamictypes(甚至是非types化)数据(如JSON,CSV,HTML,无模式XML,无模式Web服务,无模式数据库(毕竟是新的热点))进行交互。 今天,你用这些string。 一个XML API看起来像

 var doc = new XmlDocument("/path/to/file.xml"); var baz = doc.GetElement("foo").GetElement("qux"); 

等等。 但是怎么样:

 dynamic doc = new XmlDocument("/path/to/file.xml"); var baz = doc.foo.qux; 

这不好看吗?

第三个例子是反思。 今天,通过reflection来调用方法是通过将一个string传递给InvokeMember (或者任何被调用的东西)来完成的。 你知道,只是调用这个该死的东西不是更好吗?

然后, 产生dynamic数据(基本上与第二个例子相反)。 以下是一个如何生成一些dynamicXML的例子:

 dynamic doc = new XmlBuilder(); doc.articles(id=42, type="List", () => { article(() => { number(42); title("blahblubb");});}); 

这并不像等价的Ruby那么美丽,但是在如此短暂的时间里,这是最好的select:-)

最后但同样重要的是,与dynamictypes语言的集成。 无论是Silverlight应用程序中的JavaScript,embedded在业务应用程序中的自定义规则引擎,还是您在CAD程序/ IDE /文本编辑器中托pipe的DLR实例。

MSDN上有一个例子:

许多COM方法允许通过将types指定为对象来改变参数types和返回types。 这需要显式的强制转换C#中强typesvariables的值。 如果使用/ link(C#编译器选项)选项进行编译,则dynamictypes的引入使您可以将COM签名中的对象的出现视为dynamictypes,从而避免大量的转换。

另一个例子是如果你必须与dynamic语言交互。

还有一些情况下,你想使一些代码通用,但你不能,因为即使对象实现相同的方法,他们不共享一个合适的基类或接口声明你需要的方法。 这方面的一个例子就是试图用int和short做一些通用的事情。 这是一个黑客,但dynamic允许你调用这些不同types的相同的方法,允许更多的代码重用。

更新:在这里search一下发现这个相关的职位 。

从Walter Almeida的博客:使用C#中的dynamic关键字来增强面向对象的场景:

http://blog.walteralmeida.com/2010/05/using-the-dynamic-keyword-in-c-to-improve-objectorientation.html

Scott Watermasysk写了一篇关于在MongoDB C#驱动程序中使用dynamic字典关键属性映射的文章。

http://simpable.com/code/mongodb-dynamics/

我认为其他人已经给出了一些很好的答案,所以我只是想添加大卫汉森的这个例子。 历史logging显示了迄今为止我发现的最实用的应用程序,用于C#中的dynamictypes,用于创build代理对象。 在这个例子中,他创build了一个允许引发WPF绑定错误的代理。 我不确定在通过使用CustomTypeDescriptors和属性描述符概念进行WPF绑定的情况下是否也可以实现这一点,但不pipe我认为使用新的C#4.0dynamictypes是否能够很好地展示它的function。

使用.net 4.0 Dynamics在WPF和Silverlight中引发绑定exception

另一个我能想到的用于dynamictypes的用法是创build类似地可以作为WPF中的DataContext插入的代理,或者其他需要通用对象types的地方,并且通常使用reflection方法来询问types。 在这些情况下,特别是在构buildtesting时,可以使用dynamictypes,然后允许代理对象以dynamic方式调用属性访问器并进行相应的日志logging,而不必在testing类中对属性进行硬编码。

我读了Scott Hanselman的一篇有趣的文章(附后)。 他指出,与使用对象相反,您可以使用dynamic引用来自编译器不知道方法的早期COM对象的方法。 我发现链接有用。

Scott Hanselman – C#4和dynamic关键字