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

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

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

有一些非常简单的示例实现(f.x. 这里这里),但是有人可以指出我更完整的实现或一些真实的文档吗?

特别是,你到底应该如何处理“参数”参数?

有帮助吗?

解决方案

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

使用此功能时,请记住CTP中的System.Core版本是在8月底从快照中获取的。它与IronPython的任何特定测试版都不完全对应。自那时起,对DLR进行了一些改动。

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

其他提示

如果你想要一个包含源代码的端到端样本,导致一个动态对象存储一个Dictionary中任意属性的值,那么我的帖子”A first看看C#4.0中的Duck Typing 可能适合你。我写了这篇文章,展示了如何将动态对象转换为静态类型的接口。它有一个完整的鸭子工作实现,它是一个IDynamicObject,可能就像一个IQuack。

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

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

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

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

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

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

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

本演示还提供了有关 DLR 的大量信息:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top