【问题标题】:How do you implement C#4's IDynamicObject interface?你如何实现 C#4 的 IDynamicObject 接口?
【发布时间】:2008-10-29 06:38:02
【问题描述】:

要在 C# 4.0 中实现“方法缺失”语义等,您必须实现 IDynamicObject:

public interface IDynamicObject
{
  MetaObject GetMetaObject(Expression parameter);
}

据我所知,IDynamicObject 实际上是 DLR 的一部分,所以它不是新的。但是我找不到太多关于它的文档。

那里有一些非常简单的示例实现(f.x.herehere),但谁能指出更完整的实现或一些真实的文档?

特别是,您应该如何处理“参数”-参数?

【问题讨论】:

    标签: dynamic c#-4.0 dynamic-language-runtime idynamicobject


    【解决方案1】:

    简短的回答是,MetaObject 负责实际生成将在调用站点运行的代码。它使用的机制是 LINQ 表达式树,它在 DLR 中得到了增强。所以它不是从一个对象开始,而是从一个表示对象的表达式开始,最终它需要返回一个描述要采取的动作的表达式树。

    在玩这个时,请记住 CTP 中的 System.Core 版本取自 8 月底的快照。它与 IronPython 的任何特定 beta 版都不是完全对应。从那时起,DLR 已经进行了许多更改。

    此外,为了与 CLR v2 System.Core 兼容,从 beta 4 或 beta 5 开始的 IronPython 版本现在将 System 命名空间中的所有内容重命名为 Microsoft 命名空间。

    【讨论】:

      【解决方案2】:

      如果您想要包含源代码的端到端示例,从而生成一个动态对象,该对象将任意属性的值存储在 Dictionary 中,那么my post "A first look at Duck Typing in C# 4.0" 可能适合您。我写那篇文章是为了展示如何将动态对象转换为静态类型的接口。它有一个完整的 Duck 工作实现,它是一个 IDynamicObject,可以像 IQuack 一样工作。

      如果您需要更多信息,请在我的博客上与我联系,我会尽我所能为您提供帮助。

      【讨论】:

        【解决方案3】:

        我刚刚在这里写了一篇关于如何做到这一点的博客:

        http://mikehadlow.blogspot.com/2008/10/dynamic-dispatch-in-c-40.html

        【讨论】:

        • 每当我发布类似这样的内容时,它只是指向文章(泥潭或其他人的)的链接,我都会被否决。
        【解决方案4】:

        这是我目前所知道的:

        动态语言运行时目前作为IronPython project 的一部分进行维护。所以这是获取信息的最佳地点。

        实现支持 IDynamicObject 的类的最简单方法似乎是从 Microsoft.Scripting.Actions.Dynamic 派生并覆盖相关方法,例如实现函数调用语义的 Call 方法。看起来 Microsoft.Scripting.Actions.Dynamic 没有包含在 CTP 中,但 IronPython 2.0 中的那个看起来可以工作。

        我仍然不清楚“参数”参数的确切含义,但它似乎为动态对象的绑定提供了上下文。

        【讨论】:

          【解决方案5】:

          此演示文稿还提供了有关 DLR 的大量信息:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多