c# - 比使用太多开关盒更好的解决方案

标签 c# selenium

我有这个 switch case 来识别 Excel 中的值,并根据 DemoName 中传递的值检查调用哪个函数,但我需要一个比这更好的解决方案:

public void SelectDemoAccount(string dataKeyname, string sheetName)
{
    var Demo = new Demoing(DriverHelper.GetDriver);
    var ud = ExcelDataHelper.GetTestData(dataKeyname, sheetName);
    String DemoName = ud.DemoName;
    switch (DemoName)
    {
        case "Abc":
            Demo.ClickAbc();
            break;
        case "Def":
            Demo.ClickDef();
            break;
        case "Ghi":
            Demo.ClickGhi();
            break;
        case "Dsa":
            Demo.ClickDsa();
            break;
        case "Qwe":
            Demo.ClickQwe();
            break;
        case "Zxc":
            Demo.ClickZxc();
            break;
        case "Hjk":
            Demo.ClickHjk();
            break;
        case "Fgh":
            Demo.ClickFgh();
            break;
        case "Cxz":
            Demo.ClickCxz();
            break;
        case "Nmq":
            Demo.ClickNmq();
            break;
        case "Atb":
            Demo.ClickAtb();
            break;
        case "Smt":
            Demo.ClickSmt();
            break;
        case "Mdt":
            Demo.ClickMdt();
            break;
        case "Ldt":
            Demo.ClickLdt();
            break;
        case "Cdt":
            Demo.ClickCdt();
            break;
        case "Hdt":
            Demo.ClickHdt();
            break;
    }    
}

最佳答案

您可以创建一个Dictionary,其中Key 是您在当前开关代码中使用的字符串,Value 是要执行的方法来自 demo 变量。

var Demo = new Demoing(DriverHelper.GetDriver);
Dictionary<string, Action> demoMethods = new Dictionary<string, Action>();
demoMethods.Add("Abc", Demo.ClickAbc);
... add the other keyvalue pairs here

现在,当您需要调用该方法时,只需使用

var ud = ExcelDataHelper.GetTestData(dataKeyname, sheetName);
String DemoName = ud.DemoName;
demoMethods[DemoName].Invoke();

这假设您总是使用相同的 Demo 实例,否则,如果调用的代码不是静态的但需要在 Demoing 类的实例上执行,您需要有一个Demoing 类中的一组静态方法。每个静态方法都接收一个 Demoing 类的实例以与底层方法一起工作。

public class Demoing
{
     public static void ClickAbc(Demoing current)
     {
        current.DoSomething();
        .... whatever ....
     }
}

现在您可以使用不同的 Action 值准备字典,

Dictionary<string, Action<Demo>> demoMethods = new Dictionary<string, Action<Demo>>();
demoMethods.Add("Abc", Demoing.ClickAbc);

当你需要用你编写的特定实例调用方法时

var Demo = new Demoing(DriverHelper.GetDriver);
var ud = ExcelDataHelper.GetTestData(dataKeyname, sheetName);
String DemoName = ud.DemoName;
demoMethods[DemoName].Invoke(Demo);

最后,还有另一种方法可以在不使用静态方法的情况下使用字典,并将所有内容封装在 Demoing 类中。这个想法来自现在被Tim Schmelter删除的答案.
这里的字典是 Demoing 类的内部,并且提供了一个公共(public)方法来访问字典操作:

public class Demoing
{
    private Dictionary<string, Action> nameActions;
      
    private Demoing()
    {
        InitNameActions();
    }

    private void InitNameActions()
    {
        nameActions = new Dictionary<string, System.Action>(StringComparer.OrdinalIgnoreCase)
        {
            {"Abc", ClickAbc},
            // ...
        }
    }

    public Action GetAction(string name){
        return nameActions.TryGetValue(name, out Action action) ? action : null;
    }
}

调用如下

var demo = new Demoing(DriverHelper.GetDriver);
String demoName = ud.DemoName;
Action action = demo.GetAction(demoName);
action?.Invoke();

从封装的角度来看,这种方式更好。但请记住,现在每个 Demoing 类型的对象都有其字典,如果周围有很多 Demoing 对象,这可能不是内存占用的最佳选择。

关于c# - 比使用太多开关盒更好的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66411326/

相关文章:

c# - 获取给定字符串中的特定句子

c# - 如何测试给定的功能代码单元 (C#) 是否不创建/写入任何文件到磁盘?

python - 无法在 appium python 中找到定位器

python - 使用 headless 选项时出现 ElementNotInteractableException 错误

c# - 密码检索和存储

c# - Worker 服务意外停止工作

c# - 如何在 XAML 中创建类的实例?

java - Selenium Java - 如何外包 @Config 并从外部类调用测试?

selenium - 使用 Selenium-Webdriver 2.0 时如何加快 Internet Explorer 中的 sendkeys() 速度?