2008-10-29 74 views
6

要实现“方法缺失” -semantics和这样在C#4.0中,你必须实现IDynamicObject:如何实现C#4的IDynamicObject接口?

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

至于我可以想出了IDynamicObject实际上是DLR的一部分,所以它是不是新。但是我一直无法找到关于它的很多文档。

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

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

回答

4

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

当玩这个时,请记住CTP中的System.Core版本是从8月底的快照中获取的。它并不完全对应于任何特定的IronPython测试版。自那时以来,DLR已经进行了一些改变。另外,为了与CLR v2 System.Core兼容,从beta 4或beta 5开始的IronPython版本现在将系统命名空间中的所有内容都重命名为Microsoft命名空间。

0

这是我迄今想通了:

动态语言运行时目前保持为IronPython project的一部分。所以这是最好的信息去处。

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

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

3

如果你想要一个端到端的样品,它包括源代码,导致在字典中存储的任意属性值,则动态对象my post "A first look at Duck Typing in C# 4.0"可能适合你。我写了这篇文章来展示如何将动态对象转换为静态类型的接口。它有一个完整的Duck工作实现,它是一个IDynamicObject,可能就像一个IQuack。

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