2012-05-23 54 views
3

有兩個不同的用戶控件共享一些共同的屬性。 我想要做的是根據外部標誌在這兩者之間切換。用戶控制開關

UserControl u1, u2; 

if(flag) 
{ 
    u1 = u1 as ControlType1; 
    u2 = u2 as ControlType1; 
} 
else 
{ 
    u1 = u1 as ControlType2; 
    u2 = u2 as ControlType2; 
} 

SomeMethod(u1.SelectedItemName, u2.SelectedItemName); 

由於UserControl沒有名爲「SelectedItemName」的屬性,所以代碼不會拋出錯誤。

我目前所做的是,我在UserControl上添加了一個擴展方法,它使用反射獲取「SelectedItemName」,並通過調用u1.SelectedItemName()而不是u1.SelectedItemName來獲取值;

我的問題是什麼是一個簡單的方法來解決這個問題,而不使用擴展/也許正確的方式。請注意,我不想在if語句中重複SomeMethod(a,b)。

+0

如果'u1'被定義爲類型'UserControl',那麼什麼是說'U1 = U1作爲ControlType'點? – mellamokb

回答

5

我的建議是使這兩個UserControl類都實現共享接口或從共享基類派生。然後,您可以針對基類或接口進行開發,而無需擔心標誌/開關。

IYourUserControl u1, u2; 

SomeMethod(u1, u2); 

這會工作提供的someMethod被定義爲:

void SomeMethod(IYourUserControl one, IYourUserControl two) { // ... 
+0

這也是我想要的建議,界面:) – sasjaq

+0

我沒有對用戶控件的控制權,但我同意你這是正確的方式。 – edocetirwi

+0

@edocetirwi無法控制用戶控件,反射可能是實現這一目標的唯一方法。這只是醜陋的。 –

3

試試這個isntead:

UserControl u1, u2; 

if(flag) 
{ 
    u1 = u1 as ControlType1; 
    u2 = u2 as ControlType1; 
    SomeMethod((u1 as ControlType1).SelectedItemName, (u2 as ControlType1).SelectedItemName); 
} 
else 
{ 
    u1 = u1 as ControlType2; 
    u2 = u2 as ControlType2; 
    SomeMethod((u1 as ControlType2).SelectedItemName, (u2 as ControlType2).SelectedItemName); 
} 

或者,如果您創建一個BaseControlType包含SelectedItemNameControlType1ControlType2從擴展,你可以這樣做:

UserControl u1, u2; 

if(flag) 
{ 
    u1 = u1 as ControlType1; 
    u2 = u2 as ControlType1; 
} 
else 
{ 
    u1 = u1 as ControlType2; 
    u2 = u2 as ControlType2; 
} 

SomeMethod((u1 as BaseControlType).SelectedItemName, (u2 as BaseControlType).SelectedItemName); 
+0

我只是補充說我不想重複SomeMethod()兩次;道歉不要添加這個問題。 – edocetirwi

+0

然後,您應該擁有一個BaseControlType,其中包含可以投射到的「SelectedItemName」屬性,您可以在「SomeMethod(...)」調用中使用該屬性。看我的編輯。 – qJake

+0

@SpikeX即[Reed's answer](http://stackoverflow.com/a/10726747/1159478)。 – Servy