【问题标题】:What is the practical use of "dynamic" variable in C# 4.0?C# 4.0 中“动态”变量的实际用途是什么?
【发布时间】:2010-09-20 04:30:54
【问题描述】:

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

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

这个有什么实际用途?

【问题讨论】:

  • 抱歉,上面的链接似乎无法正常工作,请从microsoftpdc.com 开始,您可以浏览会话以访问视频。
  • 相关帖子herehere

标签: c# .net c#-4.0


【解决方案1】:

您实际上无法动态创建该方法 - 但您可以获得IDynamicMetaObject 的实现(通常通过扩展DynamicObject)来响应就好像该方法存在

用途:

  • 使用弱 API(例如办公室)针对 COM 对象进行编程
  • 调用动态语言,例如 Ruby/Python
  • 可能创建“可探索”对象 - 想象一个类似 XPath 的查询,但通过方法/属性调用,例如document.RootElement.Person[5].Name["Attribute"]
  • 毫无疑问,我们还没有想到更多:)

【讨论】:

  • 我真的很喜欢 XML 的想法。这会涉及某种自定义属性包吗?
  • 它有点像一个属性包,但我希望它能够包装 LINQ to XML 对象并在需要时查找元素,而不是在创建时全部获取它们。自从我写这篇文章以来,名字已经发生了一些变化 - 我会更新......
【解决方案2】:

首先,你现在不能使用它。它是 C#4 的一部分,将在未来某个时间发布。

基本上,它是针对一个对象,其属性要到运行时才能知道。也许它来自一个 COM 对象。正如您所描述的,也许它是一个“动态定义的对象”(尽管我认为目前还没有或计划创建这些对象)。

它有点像 System.Object,除了你可以调用编译器不知道的方法,而运行时会计算出如何调用。

【讨论】:

  • 其实有这样一个工具,ExpandoObject。
【解决方案3】:

我能想到的两大优势是鸭式打字和在应用程序中使用 C# 作为脚本语言的能力,类似于 javascript 和 Python。最后一个让我有点泪目。

【讨论】:

    【解决方案4】:

    将其视为反射的简化形式。而不是这个:

    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);
    

    【讨论】:

    • 太糟糕了,这个例子不起作用。我想在我正在教授的课程中使用它
    【解决方案5】:

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

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

    调用 COM 和调用动态语言。

    我期待着看看是否有办法做一个类似于 Ruby 的missing_method。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2011-02-24
      • 2016-06-03
      • 2011-04-02
      • 2019-05-17
      • 2015-04-22
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多