2014-04-10 75 views
0

此代碼有效。但注意到相似第六& 10日線之間,沒有泛型的運行時類型鑄造

void someThing_Click(object sender, RoutedEventArgs e) 
{ 
    President pres;     
    if (e.GetType() == typeof(MouseButtonEventArgs)) 
    { 
     pres = (sender as SomeUserControl).DataContext as President; 
    } 
    else 
    { 
     pres = (sender as MenuItem).DataContext as President; 
    } 
} 

是有辦法縮短這樣的代碼,

Type t = (e.GetType() == typeof(MouseButtonEventArgs)) ? SomeUserControl : MenuItem; 
pres = (sender as t).DataContext as President; 

上面的代碼不工作,只是爲了說明。

+2

僅當您檢查結果時才使用「as」運算符。在其他情況下,你應該使用普通的cast(Type)操作符 - 它具有更好的性能。 – GrzegorzM

+0

「正常」(直接)投射不會更快,它在內部使用[is]和[as]運算符的組合。請看我對@xxMUROxx的評論回答 – Andrew

回答

2

DataContext屬性的類別爲FrameworkElement,即您的SomeUserControlMenuItem繼承自FrameworkElement。所以,你可以將其類型轉換爲FrameworkElement直接:

pres = ((FrameworkElement)sender).DataContext as President; 
+0

這與OP的代碼在語義上不同,你錯過了其他部分;雖然如果阻止自己完全多餘 –

+0

如果我猜測沒有必要,他得到總統的兩種情況 –

+0

@Sriram - 我希望從描述中明確意圖。任何方式刪除其他部分。 –

4

我覺得沒必要檢查事件參數的類型,並且所有的,這應該是足夠

President pres = ((FrameworkElement)sender).DataContext as President; 
2

直接使用DataContextFrameworkElement

var fe = sender as FrameworkElement 
if(fe != null) 
{ 
    President pres = fe.DataContext as President; 
} 
+0

[as]的組合並與null進行比較是使用無類型對象進行特定類型作業的最有效方式(直接投射首先用[is]進行檢查,然後引發異常或返回使用[as]運算符,這是一個額外的操作) – Andrew

+0

@Andrew Point 1同意了,但我不同意'直接強制首先檢查[is],然後拋出異常或返回使用[as]運算符的對象,即一個額外的[操作]可以顯示這個官方文檔?或者任何可證明的鏈接? –

+0

例如這裏:http://stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr直接轉換是內部翻譯爲'如果(變量是T){返回(變量爲T)}拋出......' – Andrew