2011-06-14 67 views
4

可能重复:
How will you use the C# 4 dynamic type ?C#实际使用

什么是动态关键字的实际动手用法?

dynamic a = 1; 
a.Crash(); 

我知道在XML链中它更具可读性的情况,但除此之外,它有什么好处?

+0

http://msdn.microsoft.com/en-us/library/dd264736.aspx – 2011-06-14 16:58:38

回答

4

这里的好文章:

作为开发人员,您使用动态 关键字预计将 变量包含这样 为对象从COM或DOM API 返回不确定类型的对象;从动态语言 (例如IronRuby)获得;来自 的反思;从构建的对象 动态在C#4.0中使用新的 扩展功能。

Using the Dynamic Keyword in C# 4.0

+3

+1。好文章。特别是关于'var vs. dynamic',因为很多人认为他们是一样的。 – 2011-06-14 17:02:47

2

它在COM互操作的情况下,您通常需要编写大量的互操作相关的代码特别有用。

+0

DIAF DTE [。](http:// derp) – Will 2011-06-14 17:02:25

0

DLR(动态语言运行时)基本上使每个人都可以与每个人交谈。这不仅包括Python和Ruby,还包括Silverlight,Office/COM等。

+0

这也是一个很好的阅读http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx – BentOnCoding 2011-06-14 17:00:50

+1

C#'dynamic' keyword!= DLR。 – delnan 2011-06-14 17:01:23

0

克里斯提到它在COM互操作场景中非常有用。

另外,它对非常有用。您可以通过动态模型获得视图。你也有ViewBag对象,可以容纳任何东西。

另一个用途是举行json object, if you implement a DynamicObject class。在使用API​​时,这是非常有用

+0

我一直在MVC视图模型使用的动态颇为失望。它非常容易受伤。你不能传递到动态扩展方法,这意味着你需要将其转换为已知类型的方法的HtmlHelper使用,并且当它们被编译为内部不能传递匿名类型为动态视图。这是听起来不错的东西之一 - 但实际上并非如此。 – 2011-06-14 17:09:11

+0

@詹姆斯测试一个匿名对象和真的不起作用。我记得另一个用于动态的应用,并补充说。 – BrunoLM 2011-06-14 17:19:54

1

我发现最实际的用途是处理COM互操作场景。许多传统COM组件最终生成的签名无法通过托管代码进行大量投射,原因是许多项目被编组为object。它导致如下代码。

IUser GetAUser() { ... } 
IUser user = GetAUser(); 
IAddress address = (IAddress)user.GetAddress(); 
int zipCode = (int)address.GetZipCode(); 

对于深层嵌套的层次结构,情况会变得更糟。虽然这段代码是类型安全的,但它并没有违反任何CLR规则,但它是不安全的,因为开发人员依赖于类型的实现细节来完成工作。它并不比动态等价物更安全。

dynamic GetAUser() { ... } 
int zipCode = (int)GetAUser().GetAddress().GetZipCode(); 
+0

不示例代码动态版本违反“两点”禁止写入COM-互操作代码(即生成的代码“隐藏”的RCW)? – 2013-09-03 21:09:35

0

当您有几个方法重载并且您已将该参数作为对象接收时,对POCO使用dynamic关键字可能非常有用。将参数强制转换为动态参数,它将根据运行时类型解析正确的重载 - 没有动态的情况下最终会产生一系列if/elseif语句,yuck。

使用与DynamicObjects子类的动态关键字可以让你摆脱锅炉板,更容易写出流畅的API和创建代码,是迄今为止更具延展性。例如,这里是一个动态api,摆脱了与MVVM绑定有关的大量样板代码http://code.google.com/p/impromptu-interface/wiki/UsageMVVM