3

いくつかの共通のプロパティを共有する 2 つの異なる UserControls があります。私がやりたいことは、外部フラグに基づいてこれら 2 つを切り替えることです。

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」というプロパティがないため、コードはエラーをスローしません。

私が現在行っていることは、リフレクションを使用して「SelectedItemName」を取得する UserControl に拡張メソッドを追加し、u1.SelectedItemName の代わりに u1.SelectedItemName() を呼び出して値を取得することです。

私の質問は、拡張機能を使用せずにこれを修正する簡単な方法は何か、おそらく正しい方法です。if ステートメント内で SomeMethod(a,b) を繰り返したくないことに注意してください。

4

2 に答える 2

5

私の提案は、これらのUserControlクラスの両方に共有インターフェイスを実装するか、共有基本クラスから派生させることです。その後、フラグ/スイッチをまったく気にせずに、基本クラスまたはインターフェイスに対して開発できます。

IYourUserControl u1, u2;

SomeMethod(u1, u2);

SomeMethod が次のように定義されていれば、これは機能します。

void SomeMethod(IYourUserControl one, IYourUserControl two) { // ...
于 2012-05-23T19:42:52.430 に答える
3

代わりにこれを試してください:

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

または、and whichBaseControlTypeを含み、fromを拡張する を作成する場合は、次のようにすることができます。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);
于 2012-05-23T19:40:58.070 に答える