有没有一种方法可以强制转换对象并在同一行中访问其属性

本文关键字:一行 属性 访问 方法 一种 转换 有没有 对象 | 更新日期: 2023-09-27 18:20:51

我是在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行。

有没有一种方法可以强制转换对象并在同一行中访问其属性

我想您只是缺少了一组括号。您想转换为Checkbox,然后获得它的属性:

if (((CheckBox)sender).Checked)

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

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

if(((CheckBox)sender).Checked)

然而,我不会这么做。为什么?如果您想再次以文本框的形式访问sender,则不希望再次强制转换。

您可以。例如:

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

它需要这样:

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

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

不知道任何C#,但((CheckBox)sender).Checked)应该可以工作。在java中,"."(成员访问)比强制转换具有更高的优先级,因此放置这样的括号应该会强制首先进行强制转换。

您只需要在if语句中再加几个括号:

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