2013-07-03 39 views
1

我在C#窗体中的事件处理程序的上下文中讨论,但我假设答案可以在C#中的任何地方使用。有没有办法在同一行中投射对象并访问其属性?

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

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

而是出于好奇纯我想知道是否有办法做到这一点像我给了第二个例子一行。我想知道,因为我认为它看起来更好,显然缩短了一行。

+4

不('(CheckBox)sender).Checked'工作吗? – RBarryYoung

+1

除了答案之外,还可以通过下面的方法缩短答案:var isChecked =((CheckBox)sender)。 ThisFunction(uniquetocheckbox,isChecked); AssociatedButton.Enabled = isChecked;' –

+0

@MikeMcCaughan辉煌,甚至没有想到这一点。将实施这一点。 – SmashCode

回答

7

我认为你只是缺少一组括号。你想转换为Checkbox,则得到的属性:

if (((CheckBox)sender).Checked) 

这将迫使运营的第一顺序来投,然后获取属性自投结果。

+0

您应该指出,OPs语法试图从'.Checked'属性中输出结果,以清楚地说明代码无法工作的原因。 –

0

你只需要一对夫妇更括号中的if声明:

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

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

if(((CheckBox)sender).Checked) 

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

2

您可以。例如:

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

它需要是这样的:

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

但我个人喜欢你已经证明更好的方式。那样如果需要再次铸造它,它已经完成了。

1

不知道任何C#但((CheckBox)sender).Checked)应该工作。在java中的“。” (成员访问权限)的优先级高于cast,所以像这样放置括号应该强制首先发生。

相关问题