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

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

或者,如果您创建一个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);
于 2012-05-23T19:40:58.070 回答