C# 改进If-else语句编码

C# 改进If-else语句编码,c#,c#-4.0,C#,C# 4.0,我有一个包含“加”和“减”的下拉列表。当用户选择其中一个时,它将调用函数Calculate() 我不想硬编码它来比较行动。这似乎不符合开闭原则。如果我更改下拉列表中的文本,我还需要更改函数。我可以知道如何改进此代码吗?通过使用Enum,您可以在每次组合框项目文本更改时不更改硬代码值的情况下实现此功能。 下面的示例显示如何填充组合框,以及如何使用enum从组合框中检索值 枚举声明 public enum Operation { Add= 0, Subtract= 1 }; 填充组合框 cbOp

我有一个包含“加”和“减”的下拉列表。当用户选择其中一个时,它将调用函数Calculate()


我不想硬编码它来比较行动。这似乎不符合开闭原则。如果我更改下拉列表中的文本,我还需要更改函数。我可以知道如何改进此代码吗?

通过使用Enum,您可以在每次组合框项目文本更改时不更改硬代码值的情况下实现此功能。
下面的示例显示如何填充组合框,以及如何使用enum从组合框中检索值

枚举声明

public enum Operation { Add= 0, Subtract= 1 }; 
填充组合框

cbOperation.DataSource = Enum.GetValues(typeof(Operation ));
根据所选项目执行操作

Enum.TryParse(cbOperation.SelectedValue.ToString(), out Operation selectedOperation);
        switch (selectedOperation)
        {
            case Operation.Add:
                Console.WriteLine("Add operation selected");
                break;
            case Operation.Subtract:
                Console.WriteLine("Subtract operation selected");
                break;
        } 

通过这样做,您无需每次更改组合框项文本。您只需更改它在组合框中自动反映的枚举值。

请确保当您有一个代码时,它具有的链,否则应该有改进,因此我的建议如下:

您可以使用以下内容:

public class DoStuff
{
    private int Calculate(string sAction)
    {
        var actionManager = new ActionManager();
        var a = 1;
        var b = 2;
        //var actionResult= actionManager[this should come from your drop down].Invoke(a, b);
        var actionResult= actionManager[sAction].Invoke(a, b);


        //you can even Register New Action Like this :
        actionManager.Add("Multiply",(x,y)=>x*y);

        //then you can use it somewhere else:
        var multiplyResult =  actionManager["Multiply"].Invoke(a, b);
        return actionResult;
    }
}
首先添加用于管理操作的类:

 public class ActionManager : Dictionary<string, Func<int, int, int>>
    {
        public ActionManager()
        {
            this.Add("action", (x, y) => x + y);
            this.Add("Subtract", (x, y) => x - y);
        }

    }
因此,每次您的操作发生更改时,您只需在ActionManager中添加新操作。使用这种方法,不需要if-else语句


顺便说一下,您甚至可以使用接口和DI来松耦合ActionManager

我认为您应该将此发布到您可以使用枚举填充下拉列表并检查枚举的值。此外,您还可以将
if…else if
构造更改为
开关。当你添加更多的动作时,它会减少一点代码。考虑一个<代码>字典<代码>,并使用它来填充下拉列表。我认为你的代码是完全好的,你为什么要改变它呢?它很容易阅读,涵盖了所有情况。我投票结束这个问题,因为它属于on。Hi@Clinton Prakash,如果我在Enum中将Add改为Add_1;我需要更改将案例添加到操作中。添加_1?嗨@Derick Loo,是的,你也需要更改。我喜欢这个包含代表字典的解决方案,很好
public class DoStuff
{
    private int Calculate(string sAction)
    {
        var actionManager = new ActionManager();
        var a = 1;
        var b = 2;
        //var actionResult= actionManager[this should come from your drop down].Invoke(a, b);
        var actionResult= actionManager[sAction].Invoke(a, b);


        //you can even Register New Action Like this :
        actionManager.Add("Multiply",(x,y)=>x*y);

        //then you can use it somewhere else:
        var multiplyResult =  actionManager["Multiply"].Invoke(a, b);
        return actionResult;
    }
}