[英]c# dynamic object Runtime Type-Checking
顯然,無論GetADynamicThing()返回的對象類型如何,以下內容在c#4.0中均有效
dynamic d = GetADynamicThing();
d.Foo();
並且,如果d的運行時類型不包含方法Foo(), 則會引發RunTimeBinderException 。
有沒有一種簡單的方法來確定d上是否存在Foo()?
否則,我們將無法在對象上進行老式的反射,或者依靠try-catch。 不確定我喜歡哪種方法。
更新:所以我們目前有3個選項:
數字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.