用户控制开关

本文关键字:开关 控制 用户 | 更新日期: 2023-09-27 18:35:19

有两个不同的用户控件共享一些共同的属性。我想做的是根据外部标志在这两者之间切换。

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

由于用户控件没有名为"SelectedItemName"的属性,因此代码不会引发错误。

我目前所做的是,我在UserControl上添加了一个扩展方法,该方法使用反射获取"SelectedItemName",并通过调用u1来获取值。SelectedItemName() 而不是 u1。选定项名称;

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

用户控制开关

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

IYourUserControl u1, u2;
SomeMethod(u1, u2);

如果将SomeMethod定义为:

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

试试这个不是:

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

或者,如果创建一个包含SelectedItemName以及从ControlType1ControlType2扩展的BaseControlType,则可以执行以下操作:

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