6

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

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

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

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

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

4

5 回答 5

4

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

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

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

于 2008-10-29T13:00:14.727 回答
3

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

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

于 2008-11-04T00:25:26.100 回答
2

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

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

于 2008-10-30T09:49:47.950 回答
0

这是我到目前为止所知道的:

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

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

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

于 2008-10-29T12:39:25.173 回答
0

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

于 2008-10-29T12:41:26.073 回答