C# 重构开关语句

C# 重构开关语句,c#,switch-statement,C#,Switch Statement,我有这个转换语句 string status = "1"; switch (status) { case "1": Button1.Visible = true; Button2.Visible = true; Button3.Visible = true; Button4.Visible = true; Button5.Visible = true; Panel1.Visible = tru

我有这个转换语句

string status = "1";
switch (status)
{
    case "1":
        Button1.Visible = true;
        Button2.Visible = true;
        Button3.Visible = true;
        Button4.Visible = true;
        Button5.Visible = true;
        Panel1.Visible = true;
        break;
    case "2":
        Button1.Visible = true;
        Button2.Visible = true;
        Button3.Visible = true;
        Button4.Visible = true;
        Button5.Visible = true;
        Panel2.Visible = true;
        break;
}
还有一些代码冗余。在这两种情况下,都会显示按钮1-5,面板会参考状态值

有没有办法缩短代码

我的方法是减少冗余但增加行数——有没有其他明显的方法我没有想到

string status = "1";
switch (status)
{
    case "1":
    case "2":
        Button1.Visible = true;
        Button2.Visible = true;
        Button3.Visible = true;
        Button4.Visible = true;
        Button5.Visible = true;
        break;
}
switch (status)
{
    case "1":
        Panel1.Visible = true;
        break;
    case "2":
        Panel2.Visible = true;
        break;
} 

创建按钮可见性的方法:

private void SetButtonVisibility(bool show)
{
    Button1.Visible = show;
    Button2.Visible = show;
    Button3.Visible = show;
    Button4.Visible = show;
    Button5.Visible = show;
}
然后在switch语句中调用此方法:

switch (status)
{
    case "1":
        SetButtonVisibility(true);
        Panel1.Visible = true;
        break;
    case "2":
        SetButtonVisibility(true);
        Panel2.Visible = true;
        break;
}

创建按钮可见性的方法:

private void SetButtonVisibility(bool show)
{
    Button1.Visible = show;
    Button2.Visible = show;
    Button3.Visible = show;
    Button4.Visible = show;
    Button5.Visible = show;
}
然后在switch语句中调用此方法:

switch (status)
{
    case "1":
        SetButtonVisibility(true);
        Panel1.Visible = true;
        break;
    case "2":
        SetButtonVisibility(true);
        Panel2.Visible = true;
        break;
}

制作一个可以切换所有需要的东西的函数怎么样?如果您添加了某些内容,则您将仅编辑该功能,以保持交换机干净:

string status = "1";
switch (status)
{
    case "1":
        enableSomething(true);
        break;
    case "2":
        enableSomething(false);
        break;
}
然后:

enableSomething(bool switcher) {
    switcher ? Panel2.Visible = true : Panel1.Visible = true;
    Button1.Visible = true;
    Button2.Visible = true;
    Button3.Visible = true;
    Button4.Visible = true;
    Button5.Visible = true;
}

制作一个可以切换所有需要的东西的函数怎么样?如果您添加了某些内容,则您将仅编辑该功能,以保持交换机干净:

string status = "1";
switch (status)
{
    case "1":
        enableSomething(true);
        break;
    case "2":
        enableSomething(false);
        break;
}
然后:

enableSomething(bool switcher) {
    switcher ? Panel2.Visible = true : Panel1.Visible = true;
    Button1.Visible = true;
    Button2.Visible = true;
    Button3.Visible = true;
    Button4.Visible = true;
    Button5.Visible = true;
}

将按钮放入列表,并使用ForEach设置属性

var listButton = new List<Button> {button1, button2, ...}

switch (status)
{
    case "1":
       listButton.ForEach(b => b.Visible = true);
       Panel1.Visible = true;
       break;
    case "2":
       listButton.ForEach(b => b.Visible = true);
       Panel2.Visible = true;
       break;
}

将按钮放入列表,并使用ForEach设置属性

var listButton = new List<Button> {button1, button2, ...}

switch (status)
{
    case "1":
       listButton.ForEach(b => b.Visible = true);
       Panel1.Visible = true;
       break;
    case "2":
       listButton.ForEach(b => b.Visible = true);
       Panel2.Visible = true;
       break;
}

您可以创建新方法来处理按钮的可见性状态,如下所示:

    private void ChangeButtonVisibility(bool Status)
    {
        Button1.Visible = Status;
        Button2.Visible = Status;
        Button3.Visible = Status;
        Button4.Visible = Status;
        Button5.Visible = Status;
        Panel1.Visible = Status;
    }
        switch (status)
        {
            case "1":
                ChangeButtonVisibility(true);
                break;
            case "2":
                ChangeButtonVisibility(false);
                break;
        }
然后从switch语句调用具有适当值的方法,如下所示:

    private void ChangeButtonVisibility(bool Status)
    {
        Button1.Visible = Status;
        Button2.Visible = Status;
        Button3.Visible = Status;
        Button4.Visible = Status;
        Button5.Visible = Status;
        Panel1.Visible = Status;
    }
        switch (status)
        {
            case "1":
                ChangeButtonVisibility(true);
                break;
            case "2":
                ChangeButtonVisibility(false);
                break;
        }

您可以创建新方法来处理按钮的可见性状态,如下所示:

    private void ChangeButtonVisibility(bool Status)
    {
        Button1.Visible = Status;
        Button2.Visible = Status;
        Button3.Visible = Status;
        Button4.Visible = Status;
        Button5.Visible = Status;
        Panel1.Visible = Status;
    }
        switch (status)
        {
            case "1":
                ChangeButtonVisibility(true);
                break;
            case "2":
                ChangeButtonVisibility(false);
                break;
        }
然后从switch语句调用具有适当值的方法,如下所示:

    private void ChangeButtonVisibility(bool Status)
    {
        Button1.Visible = Status;
        Button2.Visible = Status;
        Button3.Visible = Status;
        Button4.Visible = Status;
        Button5.Visible = Status;
        Panel1.Visible = Status;
    }
        switch (status)
        {
            case "1":
                ChangeButtonVisibility(true);
                break;
            case "2":
                ChangeButtonVisibility(false);
                break;
        }

<> P>一个有趣的方法,你可以考虑去声明。< /P> 让我们创建一个类,我们将其称为State:

我们的想法是,在这个类中放入任何可以影响UI状态的内容。目前,我们只有Status属性

然后,创建一些行为方法,这些方法可以是lambdas;我们想要/需要的是它们通常是可重用的,并且能够满足以下要求:

然后,创建一个字典集合,我在下面称之为uiUpdates,并添加您想要的所有行为。请注意,这种设计允许您在每个控件上有多个裂缝-可能您希望基于状态和可见来影响字体,如果需要,您可以使用两种小方法来实现这一点,而不是使用一种方法来处理这两种情况

应在InitializeControl完成工作后立即填充此词典

注意:现在您可以使用一种方法:

private void AfterStateUpdated(State newState)
{
   foreach(var kvp in uiUpdates)
   {
      var c = kvp.Key;
      foreach(var update in kvp.Value)
      {
         update(newState,c);
      }
   }
}
当你的状态改变时,你就称之为。现在,您不必拥有gloryhole方法,只需知道如何基于所有可能的状态值更新所有UI状态


在上面的例子中,我假设表单字段中也有一个状态实例,但是我仍然更喜欢将状态显式地传递给操作方法,而不是让它们从表单中获取它。如果您希望有一个由多个表单使用的集中方法集,假设状态定义也适用于这种共享

,那么这就增加了重用的机会。 让我们创建一个类,我们将其称为State:

我们的想法是,在这个类中放入任何可以影响UI状态的内容。目前,我们只有Status属性

然后,创建一些行为方法,这些方法可以是lambdas;我们想要/需要的是它们通常是可重用的,并且能够满足以下要求:

然后,创建一个字典集合,我在下面称之为uiUpdates,并添加您想要的所有行为。请注意,这种设计允许您在每个控件上有多个裂缝-可能您希望基于状态和可见来影响字体,如果需要,您可以使用两种小方法来实现这一点,而不是使用一种方法来处理这两种情况

应在InitializeControl完成工作后立即填充此词典

注意:现在您可以使用一种方法:

private void AfterStateUpdated(State newState)
{
   foreach(var kvp in uiUpdates)
   {
      var c = kvp.Key;
      foreach(var update in kvp.Value)
      {
         update(newState,c);
      }
   }
}
当你的状态改变时,你就称之为。现在,您不必拥有gloryhole方法,只需知道如何基于所有可能的状态值更新所有UI状态


在上面的例子中,我假设表单字段中也有一个状态实例,但是我仍然更喜欢将状态显式地传递给操作方法,而不是让它们从表单中获取它。如果您想让多个表单使用一组中心方法(假设状态定义也适用于此类共享),这将增加重用的机会

当然:提取在这两种情况下都调用的方法。为控件选择更好的名称。另外,如果你想索引到你的面板集合中,为什么不把它们放在一个列表中呢?@Damien_The_Unsivers这只是一个示例代码来澄清我的问题是故意的,你在任何情况下都不会将任何面板设置为不可见的?当然:通过提取在两种情况下都调用的方法。为你的控件选择更好的名称。而且,如果你想索引到你的面板集合中,为什么不把它们放在一个列表中呢?@Damien_The_unsiver这只是一个示例代码来澄清我的问题是故意的,你在任何情况下都不会设置任何面板不可见?在ori中
ginal代码示例,Panel 1随案例1而更改,Panel 2随案例2而更改,因此您需要删除Panel 1。从ChangeButtonVisibility方法中可见,并将其添加为案例中的第二行。是的,我只是解释了它本身不提供完整解决方案的想法。感谢您的提示。在原始代码示例中,面板1随案例1而更改,面板2随案例2而更改,因此您需要删除面板1。从ChangeButtonVisibility方法中可见,并将其添加为案例中的第二行。是的,我只是解释了它本身并没有提供完整解决方案的想法。谢谢你的提示。