我有这个 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/