2

这是我的代码:

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

当然这是我的假功能......那么有没有办法做到这一点?

4

4 回答 4

1

因为您使用的是is运算符,所以我假设ToolStripButtonToolStripSplitButton扩展。因此是基类ButtonButtonEnabled中定义的属性。因此,将多态调用 Enabled,如果实际类型为ToolStripButton,则将Enabled调用它。所以这应该足够了

  Button button;
  button.Enabled=enable;

或者

 this.Enabled=enable;
于 2012-11-20T20:18:38.090 回答
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那么您应该使用那个。

于 2012-11-20T20:21:45.760 回答
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;
于 2012-11-20T20:13:48.387 回答
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;
  }

  //...
}
于 2012-11-20T20:14:26.917 回答