如何在 C# 中使用一种方法修改不同的布尔属性?

How to modify different boolean properties with one method within C#?

我目前面临以下问题,Menu Strip 包含几个不同的设置,例如:

所有这些项目都具有 bool 类型的相应属性,因为这些变量也传递给其他 类。目前,当我点击 "Show Y" 时,我有一个名为 HandleShowY() 的专用功能,它可以切换 bool 和菜单条项目中的复选标记。

每个新添加的 属性 的新方法对我来说似乎是一个巨大的代码味道,并且每个新 属性 都需要大量的额外开销。因此,我想出了制作一个通用的 HandleMenuStripItemBool() 的想法,它通过引用接收 属性 和菜单项,这样只有一种方法可以处理这种类型的行为。

不幸的是,我 运行 在尝试通过引用将我的 bool 属性 传递给此方法时遇到了问题,我对 action、[=18= 的了解] 和 delegate 几乎消失了,在我阅读每一个新教程后只会让我越来越困惑。

示例代码:

// different properties of type bool, defined in form1
private bool ShowX { get; set; }
private bool ShowY { get; set; }

// generic menu strip item bool handler
private void HandleMenuStripItemBool(bool boolProp, ToolStripMenuItem menuItem)
{
    // toggle bool depending on current value
    // add check mark to or remove check mark from ToolStripMenuItem
}

// click event of the "Show X" menu strip item, defined in form1
private void showXToolStripMenuItem_Click(object sender, EventArgs e)
{
    HandleMenuStripItemBool(ShowX, showXToolStripMenuItem);
}

// click event of the "Show Y" menu strip item, defined in form1
private void showYToolStripMenuItem_Click(object sender, EventArgs e)
{
    HandleMenuStripItemBool(ShowY, showYToolStripMenuItem);
}

TL;DR:创建一个通过引用接收 bool 类型的 属性 的方法的最佳方法是什么?属性?

提前致谢。

您可以将其作为参考传递并在方法内部对其进行处理:

        bool testBool;
        ToggleBoolValue(ref testBool);
        private void ToggleBoolValue(ref bool toggle)
        {
            toggle = !toggle;
            // some other tasks
        }

如果您使用的是非常现代的 C# 版本(我认为是 7.0 或更高版本),那么您可以使您的属性 ref 返回,并且然后按照 Michal 的建议使用 ref

using System;

public class Bob
{
  static void Main()
  {
    var b = new Bob();
    b.showYToolStripMenuItem_Click();
    Console.WriteLine(b.ShowY);
    Console.ReadLine();
  }
  // different properties of type bool, defined in form1
  private ref bool ShowX { get { return ref _showX; } }
  private ref bool ShowY { get { return ref _showY; }  }
  private bool _showX = false;
  private bool _showY = false;

  // generic menu strip item bool handler
  private void HandleMenuStripItemBool(ref bool boolProp)
  {
    boolProp = true;
  }

  // click event of the "Show X" menu strip item, defined in form1
  private void showXToolStripMenuItem_Click()
  {
    HandleMenuStripItemBool(ref ShowX);
  }

  // click event of the "Show Y" menu strip item, defined in form1
  private void showYToolStripMenuItem_Click()
  {
    HandleMenuStripItemBool(ref ShowY);
  }
}

(添加的主要参数和不相关的参数已删除,使其成为 self-contained 控制台演示)

虽然没有具体回答如何通过引用传递 bool 属性,但为什么不直接使用菜单项的 Checked 值,在这种情况下您不需要维护该值布尔值 属性,并且只有一个真实来源

private bool ShowX 
{ 
     get { return showXToolStripMenuItem.Checked; } 
     set { showXToolStripMenuItem.Checked = value; } 
}