簡體   English   中英

c#動態對象運行時類型檢查

[英]c# dynamic object Runtime Type-Checking

顯然,無論GetADynamicThing()返回的對象類型如何,以下內容在c#4.0中均有效

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

並且,如果d的運行時類型不包含方法Foo(), 則會引發RunTimeBinderException

有沒有一種簡單的方法來確定d上是否存在Foo()?

否則,我們將無法在對象上進行老式的反射,或者依靠try-catch。 不確定我喜歡哪種方法。

更新:所以我們目前有3個選項:

  1. 反射
  2. 捕獲異常
  3. 希望GetADynamicThing()返回您期望返回的結果

數字3似乎是動態的目標用途,在COM情況下很好 我最初問這個問題的原因是為了響應這樣的事情,即使用一些任意創建的對象的方法。 使用動態方法,這似乎是錯誤的情況。

動態類型並非要替代System.Object。 如果您不知道返回什么,那么即使在C#4中,使用System.Object或API中的具體接口仍然比使用動態方法更好。

如果您基本上知道返回的內容,那么Dynamic是非常有用的。 您應該將缺少成員(即Foo)視為例外情況,在這種情況下,例外是處理此問題的合理方法。

dynamic類型的重點是假定成員存在。

如果您真的需要在調用該方法之前知道使用反射或更好的方法來創建一個具體類型,則可以實現一個聲明Foo()的接口。 我認為如果您需要檢查Foo()是否為dynamic類型的成員,那么對您來說, dynamic是錯誤的選擇。 聽起來您需要靜態類型檢查。

如果您的架構是如此開放,以至於您不知道GetADynamicThing返回的內容,那么您應該捕獲異常或以某種方式使用反射。 但是,在大多數情況下,您會對應該得到的東西有所了解,並且可以做一些假設。

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

維修噩夢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM