2009-05-03 137 views
3

C#4.0引入了dynamic關鍵字,它將在運行時查找。動態,尷尬的反射沒有更多?

這是否意味着,我們需要反思的尷尬沒有更多?如果有,你能舉個例子嗎?

+0

第一次我問了一個關於SO的問題,5分鐘後沒有回答! – Vimvq1987 2009-05-03 03:42:25

回答

6

我們仍然必須反思 - 使用「動態」對普通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支持 - 但在前一種情況下比後者更富於表現力。

+0

哇哇,我聽說過很多關於動態語言的功能,但完全沒有得到它的工作原理。我經常使用反射類圖書館的東西,所以這是真棒。實際上我已經爲封裝反射的Object編寫了一些擴展方法....他們現在是多餘的:-( – andy 2009-05-03 08:15:41

4

動態調度只是Reflection的一種可能的用法。有很多很好的理由來詢問類的結構,獲取關於該結構的信息並以某種形式可視化或以某種方式對其進行操作,而無需動態訪問成員。反思在這裏停留。 :)

如果你想動態關鍵字here is a video from PDCthe man himself的例子談論它(和其他東西C#4.0相關)。

+0

偉大的談話 - 尤其是C#5的東西 - 讓我流口水...... – 2009-05-03 04:28:38

+0

是的,用C#編寫的REPL非常棒。 – 2009-05-03 05:05:44

1

動態會走很長的路,以解決與僅由名稱,其中該名稱是已知的和固定在編譯時已知方法的問題 - 但當然,這種方法也可以,如果你控制類型表示爲接口。

存在以下情況:dynamic不會在所有幫助:

  • ,其中方法名稱沒有在編譯時已知的(即它從配置加載/用戶輸入)
  • 對象創建
  • 也許有些仿製藥的情況

最大的用途我看到dynamic是:

  • COM互操作(顯然)
  • 通用的運營商的支持
  • 鴨打字那裏沒有通用接口
  • DLR互操作(見註釋)

但它絕對不會解決所有的反射榮辱與共。