有没有办法在同一行中转换对象并访问其属性?

时间:2013-07-03 20:51:25

标签: c# .net winforms

我在C#窗体中的事件处理程序的上下文中讨论,但我假设答案可以在C#中的任何地方使用。

举一个例子,我有一个表单,其中有许多复选框,每个复选框都激活一个按钮。 CheckedChanged事件由一个与每个CheckBox非常相似的函数处理,它现在看起来像这样:

private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
    int uniquetocheckbox = 12345;

    if(acheckbox.CheckedChanged)
    {
          ThisFunction(uniquetocheckbox, true);
          AssociatedButton.Enabled = true;
    }
    else
    {
          ThisFunction(uniquetocheckbox, false);
          AssociatedButton.Enabled = false;
    }  
}

有很多这些复选框,我试图剪切并通过每个复选框的代码,尽可能少做一些更改,所以我想做这样的事情:

private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
    int uniquetocheckbox = 12345;

    if((CheckBox)sender.Checked)  //CHANGE HERE
    {
          ThisFunction(uniquetocheckbox, true);
          AssociatedButton.Enabled = true;
    }
    else
    {
          ThisFunction(uniquetocheckbox, false);
          AssociatedButton.Enabled = false;
    }  
}

这不起作用。简单的解决方法是:

private void acheckbox_CheckedChanged(object sender, EventArgs e)
{
    int uniquetocheckbox = 12345;
    CheckBox cb = (CheckBox)sender;

    if(cb.Checked)  //CHANGE HERE
    {
          ThisFunction(uniquetocheckbox, true);
          AssociatedButton.Enabled = true;
    }
    else
    {
          ThisFunction(uniquetocheckbox, false);
          AssociatedButton.Enabled = false;
    }  
}

但出于纯粹的好奇心,我想知道是否有办法在一行中完成,就像我给出的第二个例子。我想知道,因为我觉得它看起来更好,显然缩短了1行。

6 个答案:

答案 0 :(得分:7)

我认为你只是错过了一组括号。您想要转换为Checkbox,然后获取该属性:

if (((CheckBox)sender).Checked)

这将强制执行操作的顺序,然后从转换结果中获取属性。

答案 1 :(得分:3)

当然,这是可能的。你刚刚错过了另一组括号:

if(((CheckBox)sender).Checked)

但是,我不会这样做。为什么?如果您想以自己的方式再次访问sender作为文本框,则不想再次投射。

答案 2 :(得分:2)

你可以。例如:

object o;
o = new SomeType();
var prop = ((SomeType)o).SomeProperty;

答案 3 :(得分:1)

需要这样:

if(((CheckBox)sender).Checked)  //CHANGE HERE

但我个人喜欢你表现得更好的方式。这样,如果它需要再次投入,它已经完成了。

答案 4 :(得分:1)

不知道任何C#,但((CheckBox)sender).Checked)应该有用。在java中“。” (成员访问)具有比强制转换更高的优先级,因此像这样放置括号应该强制转换首先发生。

答案 5 :(得分:0)

您的if声明中只需要几个括号:

if (((CheckBox)sender).Checked)
{
    ...
}