回答
我們仍然必須反思 - 使用「動態」對普通CLR對象將調用基於反射的調度。
所以 - 我們仍然有反映,但它會更容易做。
下面是一個例子:
// Via 'dynamic'
dynamic dx = GetSomeCLRObject();
dx.DoSomething();
dx.SomeMember = 2;
// Via Reflection
object x = GetSomeCLRObject();
Type xt = x.GetType();
MemberInfo DoSomethingMethod = xt.GetMethod("DoSomething");
DoSomethingMethod.Invoke(x, null);
PropertyInfo SomeMemberProperty = xt.GetProperty("SomeMember");
SomeMemberProperty.SetValue(x, 2);
我不知道你怎麼想,但我喜歡前者。 =)
在這兩種情況下,我沒有得到任何編譯時檢查,沒有智能感知,沒有IDE支持 - 但在前一種情況下比後者更富於表現力。
哇哇,我聽說過很多關於動態語言的功能,但完全沒有得到它的工作原理。我經常使用反射類圖書館的東西,所以這是真棒。實際上我已經爲封裝反射的Object編寫了一些擴展方法....他們現在是多餘的:-( – andy 2009-05-03 08:15:41
動態調度只是Reflection的一種可能的用法。有很多很好的理由來詢問類的結構,獲取關於該結構的信息並以某種形式可視化或以某種方式對其進行操作,而無需動態訪問成員。反思在這裏停留。 :)
如果你想動態關鍵字here is a video from PDC的the man himself的例子談論它(和其他東西C#4.0相關)。
偉大的談話 - 尤其是C#5的東西 - 讓我流口水...... – 2009-05-03 04:28:38
是的,用C#編寫的REPL非常棒。 – 2009-05-03 05:05:44
動態會走很長的路,以解決與僅由名稱,其中該名稱是已知的和固定在編譯時已知方法的問題 - 但當然,這種方法也可以,如果你控制類型表示爲接口。
存在以下情況:dynamic
不會在所有幫助:
- ,其中方法名稱沒有在編譯時已知的(即它從配置加載/用戶輸入)
- 對象創建
- 也許有些仿製藥的情況
最大的用途我看到dynamic
是:
- COM互操作(顯然)
- 通用的運營商的支持
- 鴨打字那裏沒有通用接口
- DLR互操作(見註釋)
但它絕對不會解決所有的反射榮辱與共。
- 1. PHP目錄路徑姿態的尷尬
- 2. 尷尬arc4random結果
- 3. 尷尬的數據結構
- 4. 尷尬的LINQ排序
- 5. 檢查尷尬的陣列
- 6. 尷尬的繼承問題
- 7. 尷尬轉義字符
- 8. 尷尬的差距使用的box-shadow
- 9. 查詢尷尬存儲的數據
- 10. 創建對象時的尷尬
- 11. 尷尬的Java日期創作行爲
- 12. 尷尬的DLL導出部分
- 13. 尷尬的水平中心對齊
- 14. Android的上下文getSystemService:地圖的尷尬全局狀態
- 15. 圖像視圖導致尷尬坑?
- 16. URL重寫,如何避免URL尷尬?
- 17. 如何解決這個onclick尷尬?
- 18. 對齊尷尬情節和軸標題
- 19. 拖放,防止尷尬突出顯示?
- 20. 繪製一個尷尬的大熊貓多指數數據幀
- 21. 只有一個三尷尬的代碼行? 。
- 22. 動態和反射
- 23. 動態類的c#反射
- 24. 動態加載一個沒有反射的預編譯類
- 25. 沒有反射的動態方法調用
- 26. VBA的Excel日期姿態的尷尬,我想比較今天的年
- 27. 反射和多態性
- 28. 動態通過反射
- 29. 尷尬的浮點性能(蟒蛇分佈)
- 30. 尷尬的展示只在IE中顯示一半圖像?
第一次我問了一個關於SO的問題,5分鐘後沒有回答! – Vimvq1987 2009-05-03 03:42:25