2009-08-27 105 views
1

顯然下面是在c#4.0無論()由GetADynamicThing返回的對象的類型的有效C#動態對象運行時類型檢查

dynamic d = GetADynamicThing(); 
d.Foo(); 

如果d的運行時類型不包含方法foo (),拋出一個RunTimeBinderException

會不會有一個容易確定Foo()是否存在於d?

否則,我們被卡在舊物反射對象上,或依靠try-catch。不知道我喜歡這兩種方法。

更新:因此,我們目前有3個選項:

  1. 反思
  2. catch異常
  3. 希望GetADynamicThing()返回你希望它返回什麼

數3似乎是在COM situations is great的動態的目標用法。我最初問這個問題的原因是迴應做something like this,即使用一些任意創建的對象的方法。這非常類似於使用動態的錯誤情況。

+0

編譯器是否會記住這一點。編譯器仍然知道d是什麼類型。 – chollida 2009-08-27 18:28:04

+1

@chollida:不,它沒有。在編譯時,它知道類型是動態的。它不知道這是什麼意思,在實際類型方面,這是有點點。 – 2009-08-27 18:29:04

+0

@Chollida,看他掛[動態,如何測試屬性是否可用(HTTP的 – Fredou 2009-08-27 18:29:58

回答

5

動態類型並不意味着替代System.Object。如果你不知道什麼被返回,在你的API中使用System.Object或者一個具體的接口仍然比使用動態的方法更好,即使在C#4中也是如此。

如果你基本知道動態是非常有用的,你回來了。你應該把一個失蹤的成員(即:Foo)當作一個特例,在這種情況下,這個例外是處理這種情況的合理方法。

-1

如果現在無法找到答案,我希望他們這樣做。

維護惡夢

+0

-1,我不相信你是對的。動態的一點是,你不一定知道確切的類型,也不需要在編譯時知道 - 它是動態綁定的。如果你知道類型,使用對象和明智的轉換或類型本身,而不是動態的。 – 2009-08-27 18:32:02

+0

@Jeff,那種類型的東西讓我想起了一些與vb6代碼有關的噩夢。人們會濫用。 – Fredou 2009-08-27 18:34:38

+0

當然人們會濫用,就像人們濫用擴展方法,字符串,IDisposable,以及任何其他語言功能一樣。濫用是沒有理由不給人們完成工作所需的工具。 – 2009-08-27 19:57:59

2

dynamic類型的整點是假定成員呈現。

如果你真的需要知道你調用該方法使用反射或更好,但創造一個具體類型的工具聲明Foo()接口之前。我會爭辯說,如果您需要檢查Foo()是否爲dynamic類型的成員,那麼dynamic對您而言是錯誤的選擇。這聽起來像你需要靜態類型檢查。

1

如果你的架構是如此開放,這樣你不知道什麼是由GetADynamicThing返回那麼應該捕獲異常或使用反射莫名其妙。但是,在大多數情況下,您將會很清楚自己應該得到什麼,並且可以做出一些假設。