这是我的代码:
public class MyButton
{
Object button;
public MyButton(System.Windows.Forms.ToolStripButton button)
{
this.button = button;
}
public MyButton(System.Windows.Forms.ToolStripSplitButton button)
{
this.button = button;
}
public void EnableButton(bool enable)
{
if (button is System.Windows.Forms.ToolStripButton)
((System.Windows.Forms.ToolStripButton)button).Enabled = enable;
else if (button is System.Windows.Forms.ToolStripSplitButton)
((System.Windows.Forms.ToolStripSplitButton)button).Enabled = enable;
}
//...
}
我想知道我可以缩短这段代码吗?我能以某种方式按类型投射吗?像这样:
public void EnableButton(bool enable)
{
((FakeFuctionToGetCastType(button))button).Enabled = enable;
}
当然是我的假功能......那么有办法吗?
答案 0 :(得分:1)
因为您使用的是is
运算符,所以我假设ToolStripButton
和ToolStripSplitButton
扩展Button
。因此Enabled
是基类中定义的属性Button.So,Enabled将以多态方式调用,如果实际类型为ToolStripButton
,则将调用其Enabled
。
所以这应该足够了
Button button;
button.Enabled=enable;
或
this.Enabled=enable;
答案 1 :(得分:1)
我会把它变成通用的:
public class MyButton<T> where T : System.Windows.Forms.ToolStripItem
{
T button;
public MyButton(T button)
{
this.button = button;
}
public void EnableButton(bool enable)
{
this.button.Enabled = enable;
}
}
编辑:作为旁注,您希望约束在通用分配中尽可能紧密。如果你能找到一个比Control
更接近你想要使用的控件的公共继承类,那么你应该使用那个。
答案 2 :(得分:0)
如果Enabled属性在基类Button
上(可能是),则不需要强制转换。就这样做:
public class Button
{
Control button;
public Button(Control button)
{
this.button = button;
}
public void EnableButton(bool enable)
{
button.Enabled = enable;
}
//...
}
如果Enabled属性不在Button
基类上,则可以执行此操作:
((dynamic)Button).Enabled = enable;
答案 3 :(得分:0)
你可以这样做;
public class Button
{
System.Windows.Forms.ToolStripItem button;
public MyButton(System.Windows.Forms.ToolStripItem button)
{
this.button = button;
}
public void EnableButton(bool enable)
{
button.Enable = enable;
}
//...
}