2011-08-12 41 views
10

是否可以確定動態成員訪問期望的類型?我試過確定DynamicObject成員訪問的預期類型

dynamic foo = new MyDynamicObject(); 
int x = foo.IntValue; 
int y = (int)foo.IntValue; 

而在TryGetMember攔截GetMemberBinder.ReturnType是反對任何一種方式。我也執行TryConvert想知道它是否可能會被調用來執行轉換,但它從來沒有被擊中。

是否有一些其他覆蓋我錯過了,讓我確定什麼類型的調用者想要的,以便我可以做適當的轉換?

回答

9

在C#中,使用動態時,編譯器總是將binder設置爲返回對象類型,然後再進行第二次動態隱式轉換,以獲得期望的返回類型。所以在從c#調用DynamicObject時,GetMemberBinder.ReturnType將始終是對象,但是如果返回另一種使用TryConvert實現的跳板動態對象,則可以獲取該類型,除非用戶將var or dynamic作爲變量,否則它們有一個代理在靜態類型化之前不會執行任何操作。

ImpromptuInterface做了一些不同的事情,但是沿着這些方向,因爲它也希望有一個基於返回類型的動態實現 - 只需要通過一個接口來描述動態對象。