有两种不同的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)。
答案 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
以及ControlType1
和ControlType2
延伸,则可以执行以下操作:
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);