2008-10-29 83 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。

如果您需要更多信息,請在我的博客上與我聯繫,我會盡力爲您提供幫助。