2012-05-23 4 views
3

Il existe deux UserControls différents partageant certaines propriétés communes. Ce que je voudrais faire est de basculer entre ces deux basés sur un drapeau externe.Commutateur UserControl

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); 

Depuis UserControl ne dispose pas d'une propriété appelée « SelectedItemName », le code ne jetterait erreur. Ce que j'ai fait actuellement est, j'ai ajouté une méthode d'extension sur UserControl qui obtient le "SelectedItemName" using la réflexion, et j'obtiens la valeur en appelant u1.SelectedItemName() au lieu de u1.SelectedItemName;

Ma question est ce qui est un moyen facile de résoudre ce problème sans utiliser d'extension/peut-être la bonne façon. Notez que je ne veux pas répéter SomeMethod (a, b) dans l'instruction if.

+0

Si 'u1' est défini comme le type' UserControl', alors quel est le point de dire 'u1 = u1 comme ControlType'? – mellamokb

Répondre

5

Ma suggestion serait de rend ces deux classes UserControl implémentent une interface partagée ou dérivent d'une classe de base partagée. Vous pouvez ensuite développer sur la classe de base ou l'interface sans vous soucier des indicateurs/commutateurs.

IYourUserControl u1, u2; 

SomeMethod(u1, u2); 

Ce travaillerais fourni SomeMethod a été défini comme suit:

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

c'est ce que je veux suggérer aussi, interface :) – sasjaq

+0

Je n'ai pas le contrôle sur les contrôles de l'utilisateur, mais je suis d'accord avec vous que c'est la bonne façon. – edocetirwi

+0

@edocetirwi Sans contrôle sur les commandes de l'utilisateur, la réflexion est probablement le seul moyen d'y arriver. C'est juste moche. –

3

Essayez cette 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); 
} 

Ou, si vous créez un BaseControlType qui contient SelectedItemName et qui ControlType1 et ControlType2 s'étendent à partir, vous pouvez le faire:

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

Je viens d'ajouter que je ne veux pas répéter SomeMethod() deux fois; Excusez-vous de ne pas avoir ajouté cela en question. – edocetirwi

+0

Ensuite, vous devriez avoir un BaseControlType qui contient la propriété "SelectedItemName" que vous pouvez lancer, que vous pouvez utiliser dans l'appel 'SomeMethod (...)'. Voir ma modification. – qJake

+0

@SpikeX c'est-à-dire [la réponse de Reed] (http://stackoverflow.com/a/10726747/1159478). – Servy