2008-11-03 47 views
5

根據Anders的說法,在C#4.0中,我們將獲得動態類型或「靜態類型是動態的」對象。這將允許任何方法調用解析在運行時發生,而不是編譯時。但是,是否有能力將動態對象綁定到某種合約上(因此也可以獲得完整的智能感知),而不是允許對它進行任何調用,即使您知道該合約不太可能有效。C#4.0動態對象是否有一些用於鴨子打字的設施?

I.e.而不是僅僅

dynamic foo = GetSomeDynamicObject(); 

要投或改造它把它限制在一個已知的合同只是

IFoo foo2 = foo as IFoo; 

無法找到任何東西的能力,如

​​3210

甚至就像現有C#4.0的材料一樣,但它似乎是動態範例的邏輯延伸。有更多信息的人?

回答

2

我不知道有什麼真的很像鴨子打字,恐怕。我blogged about the idea,但我不期望任何支持。使用Reflection.Emit來創建一個類,該類將生成任何給定接口的實現,在構造函數中攜帶一個動態對象,並將每個調用代理給它,可能不會太困難。不理想,但它可能是一個權宜之計。

1

這是一個很酷的想法。 如果我理解你,你正在描述/提出一個CLR的能力,當你嘗試將一個動態對象投射到一個接口時,它應該查看動態對象支持哪些方法/屬性並查看它是否具有有效實現該接口。然後,CLR將負責在對象上執行「IFoo」,然後您可以將動態對象投射到IFoo。 幾乎可以肯定,這不會被支持,但這是一個有趣的想法。

+0

由於它仍然是一個動態對象,即調用仍然會在運行時發生,但您現在可以將它作爲IFoo傳遞,因爲您告訴編譯器您的動態對象的行爲類似於IFoo – 2008-11-03 21:57:17

+0

是的,但是如果你想讓IFoo交出來,'有人'需要用它背後的動態對象來製作一個直通IFoo實現。這就是Jon Skeet上面提到的。 – mackenir 2008-11-03 22:59:10

1

Tobias Hertkorn回答了我的問題here,鏈接到他的blogpost,顯示瞭如何在MetaObject上使用Convert()方法返回動態代理的示例。它看起來非常有希望