C#4:动态类型的真实示例

Bra*_*don 65 .net c#

我认为我的大脑中途包含了C#4中的动态类型概念,但在我的生活中无法找到我真正想要使用它的场景.

我确信有很多,但我只是无法建立连接,以便我能够设计出一个更好的解决方案,而不是接口,依赖注入等动态解决方案.

那么,动态类型使用是否恰当的实际应用场景是什么?

Jör*_*tag 66

有很多你在哪里的情况下已经使用绑定动态类型和动态今天.你只是没有意识到这一点,因为它全部隐藏在字符串之后,或者System.Object直到C#4,才有必要的支持.

一个例子是COM互操作:COM实际上是一个半动态对象系统.当你进行COM互操作时,很多方法实际上都会返回一个动态对象,但是因为C#不支持它们,所以它们被返回System.Object,你必须自己抛出它们,可能会在途中捕获异常.

另一个例子是与动态类型(甚至无类型)数据交互,例如JSON,CSV,HTML,无模式XML,无模式Web服务,无模式数据库(毕竟,这是新的热点).今天,你使用字符串.XML API看起来像

var doc = new XmlDocument("/path/to/file.xml");
var baz = doc.GetElement("foo").GetElement("qux");
Run Code Online (Sandbox Code Playgroud)

等等.但是怎么样:

dynamic doc = new XmlDocument("/path/to/file.xml");
var baz = doc.foo.qux;
Run Code Online (Sandbox Code Playgroud)

那看起来不是很好吗?

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

然后,生成动态数据(基本上与第二个示例相反).这是一个如何生成动态XML的示例:

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

这并不像等效的Ruby那么漂亮,但它是我能在如此短的时间内拿出来的最好的:-)

最后但并非最不重要的是,与动态类型语言集成.无论是Silverlight应用程序中的JavaScript,嵌入在您的业务应用程序中的自定义规则引擎,还是您在CAD程序/ IDE /文本编辑器中托管的DLR实例.