2014-03-19 71 views
1

此刻我正在使用多個對象,以便從需要多次強制轉換的事件中獲取屬性。如何避免在應用強制轉換時創建多個對象?

我有關,如果有更好的,可能更短的方式如何做到這一點。

System.Windows.RoutedEventArgs eventTrack = (System.Windows.RoutedEventArgs)e; 
FluidKit.Controls.ElementFlow fluidItem = (FluidKit.Controls.ElementFlow)eventTrack.OriginalSource; 
Client.DataModel.Advertisement adv = (Client.DataModel.Advertisement)fluidItem.ClickedItem; 

string test = adv.ShopId.ToString(); 
+0

任何建議您可以使用關鍵字dynamic歡迎:-) – GibboK

+5

我不看看你的代碼有什麼問題。使用多行是最可讀的方式。然而你可以使用隱式類型變量(使用'var')。 – sloth

+2

同意@DominicKexel。你已經在以最可讀的方式做它。 (請注意,你沒有創建多個對象!) –

回答

5

那麼,有沒有什麼可以做些什麼 - 你可以嘗試構造,如

Advertisement adv = ((e as RoutedEventArgs).OriginalSource as ElementFlow).ClickedItem as Advertisement; 

但這是相當難看。還有一個方法與dynamic關鍵字是.NET 4的可供選擇:

dynamic eventArgs = e; 
dynamic adv = e.OriginalSource.ClickedItem; 

但是這對性能的影響是不利的。

我覺得你有它(也許沒有這些命名空間)的方式是最好的代碼的可讀性,同時保持低性能的影響。

+0

我不喜歡你使用'as'關鍵字,因爲它會沉默錯誤的轉換類型(如果類型不同,則返回null),與經典轉換相比。此外,動態代碼具有性能成本。這是可以接受的,但必須考慮到這一點。 –

+0

@SteveB我剛纔提到'dynamic'和masking對性能的影響只是簡單的問題'NullRefferenceException'而不是'InvalidCastException'。除此之外,在最新版本的C#中,他們計劃創建更加有趣的東西 - '?.'運算符,如果對象爲null或參考您嘗試訪問的任何字段或屬性,將返回null。 – Migol

5

您可以使用多個鑄造我在同一行:

string adv = ((Client.DataModel.Advertisement)(((FluidKit.Controls.ElementFlow)(((System.Windows.RoutedEventArgs)e).OriginalSource)).ClickedItem)).ShopId.ToString(); 

或者像Migol提到一個更好的絲毫不差

相關問題