C# 4.0中,“动态”变量有什么实际用途?

14

如果在调用方法时可能不存在,那么它们有什么用处?

这是否意味着您可以在动态对象上动态创建方法?

这有什么实际用途?


抱歉,上面的链接似乎无法正常工作,请从http://microsoftpdc.com/开始浏览会话以获取视频。 - MrJavaGuy
相关帖子请参见这里这里 - RBT
5个回答

16

您实际上无法动态创建方法,但是您可以通过实现IDynamicMetaObject(通常通过扩展DynamicObject)来响应仿佛方法存在

用途:

  • 对抗具有弱API的COM对象(例如office)
  • 调用动态语言如Ruby/Python
  • 可能使“可探索”对象 - 想象一下类似于XPath的查询,但通过方法/属性调用,例如document.RootElement.Person[5].Name["Attribute"]
  • 毫无疑问我们尚未考虑到的许多其他用途 :)

2
我非常喜欢那个XML的想法。这会涉及到一种自定义属性包吗? - tsilb
这有点像一个属性包,但我希望它能够包装LINQ到XML对象,并在需要时查找元素,而不是在创建时获取所有元素。自从我写这篇文章以来,名称已经有所改变 - 我会进行更新... - Jon Skeet

3
首先,现在你无法使用它。它是C#4的一部分,将来会发布。
基本上,它是用于一个对象,其属性直到运行时才能确定。也许它来自COM对象。也许它是一个“动态定义对象”,就像您所描述的那样(尽管我认为还没有计划或设施创建这些对象)。
它有点像System.Object,只是您可以调用编译器不知道的方法,并且运行时会找出如何调用。

1
实际上,有这样一个功能,ExpandoObject。 - Kaerber

1

把它看成是一种简化的反射形式。而不是这个样子:

object value = GetSomeObject();
Method method = value.GetType().GetMethod("DoSomething");
method.Invoke(value, new object[] { 1, 2, 3 });

你会得到这个:
IDynamicObject value = GetSomeObject();
value.DoSomething(1, 2, 3);

太糟糕了,这个例子不起作用。我本来想在我教授的课程中使用它。 - Mickey Perlstein

1
我能想到的两个重要特性是鸭子类型和在应用程序中使用C#作为脚本语言的能力,类似于JavaScript和Python。这最后一个让我有点感动。

0

我看到有几个动态ORM框架正在被编写。或者你可以自己写一个。

我同意Jon Skeet的观点,你可能会看到一些有趣的探索对象的方式。 也许使用像jQuery这样的选择器。

调用COM和调用动态语言。

我期待着看到是否有一种类似Ruby的missing_method的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接