如何使用不同类型进行投射

时间:2012-11-20 20:11:36

标签: c# class casting

这是我的代码:

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 个答案:

答案 0 :(得分:1)

因为您使用的是is运算符,所以我假设ToolStripButtonToolStripSplitButton扩展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;
  }

  //...
}