UserControl开关

时间:2012-05-23 19:38:43

标签: c# user-controls

有两种不同的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);

由于UserControl没有名为“SelectedItemName”的属性,因此代码不会抛出错误。

我目前所做的是,我在UserControl上添加了一个扩展方法,它使用反射获取“SelectedItemName”,并通过调用u1.SelectedItemName()而不是u1.SelectedItemName;

我的问题是什么是一种简单的方法来解决这个问题,而不使用扩展/也许是正确的方法。请注意,我不想在if语句中重复SomeMethod(a,b)。

2 个答案:

答案 0 :(得分:5)

我的建议是让这两个UserControl类实现共享接口或派生自共享基类。然后,您可以针对基类或接口进行开发,而无需担心标志/开关。

IYourUserControl u1, u2;

SomeMethod(u1, u2);

如果将SomeMethod定义为:

,则可以使用
void SomeMethod(IYourUserControl one, IYourUserControl two) { // ...

答案 1 :(得分: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);
}

或者,如果您创建的BaseControlType包含SelectedItemName以及ControlType1ControlType2延伸,则可以执行以下操作:

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