2010-10-20 63 views
5

我有許多接受動態對象參數(即動態foo)的數據訪問方法。由於現有的代碼,我無法使用接口來定義鍵入輸入參數。我在數據訪問方法中設置屬性,但是使用動態而不檢查是否存在屬性/方法會讓我感到緊張。是否反射是確定動態對象上屬性/方法的存在/不存在的最佳方法?

所以我正在尋找一種方法來檢查動態對象的運行時屬性/方法,但我寧願不使用反射由於性能的影響。是否有另一種/推薦的方式來查詢動態對象的屬性/方法?

感謝, 埃裏克

+0

由於性能影響,您不想使用反射,但很樂意使用* dynamic *? – 2010-10-20 17:39:35

+0

@Kirk:Dynamic的表現令人驚訝。這比訪問會員的反思要快得多... – 2010-10-20 17:49:13

+1

你認爲*他們會對性能產生影響,或者你知道*?設計決策更適合於事實。 – smirkingman 2010-10-20 19:30:26

回答

2

dynamic類型中,反射實際上不會工作(您期望的方式)。您需要檢查IDynamicMetaObjectProvider,然後使用其方法確定該類型上是否有成員。

問題是,dynamic類型在運行時添加新成員是完全可以接受的。有關示例,請參閱ExpandoObject。這不僅增加了對集合運算的新成員,但你可以很容易,做一個動態類型,它總是返回一個有效成員,不管是什麼傳遞給它,即:

dynamic myType = new DynamicFoo(); 
Console.WriteLine(myType.Foo); 
Console.WriteLine(myType.Bar); 
Console.WriteLine(myType.Baz); 

這可以這樣做覆蓋get訪問器,並使其始終有效。在這種情況下,反射將無法確定此處會起什麼作用......

+0

裏德,這是我需要的答案,但我決定採取嘗試它的方法並讓異常拋出。謝謝! – 2010-10-22 18:16:12

2

我想看看這個問題有點不同。如果您使用dynamic的對象,則屬性是否可以通過反射訪問是無關緊要的。只有通過dynamic纔可以訪問它們。那麼,爲什麼不僅僅使用這些屬性來捕捉由於他們的缺陷而導致的錯誤呢?

+0

從我+1 - 這將是我的做法。只需使用該對象,並將異常處理爲/如果他們來了。 – 2010-10-20 17:51:52

+0

@ Reed,恭喜100K! – JaredPar 2010-10-20 17:52:52

+0

謝謝!剛剛通過它今天早上:D – 2010-10-20 17:55:25