重用交换机逻辑的最佳方法是什么。我有这个switch语句一直出现在我的代码中。而不是复制粘贴它我想创建一个调用其他委托并将这些委托作为参数传递的函数。
或者有更好的方法吗?
功能1:
switch (test)
{
case "x":
DoSomethingX();
break;
case "y":
DoSomethingY();
break;
case "z":
DoSomethingZ();
break;
}
功能2:
switch (test)
{
case "x":
DoSomethingXxxx();
break;
case "y":
DoSomethingYyyy();
break;
case "z":
DoSomethingZyyy();
break;
}
答案 0 :(得分:9)
你也可以有一个Dictionary(或Func而不是Action)或类似的东西(考虑到你的函数有类似的签名)。然后你可以使用开关,而不是使用开关,你可以有:
public class MyClass
{
Dictionary<string, Action> myDictionary;
public MyClass()
{
BuildMyDictionary();
}
private Dictionary<int, Action<int, int>> BuildMyDictionary()
{
myDictionary.Add("x", DoSomethingX);
myDictionary.Add("y", DoSomethingY);
myDictionary.Add("z", DoSomethingZ);
myDictionary.Add("w", DoSomethingW);
}
public void DoStuff()
{
string whatever = "x"; //Get it from wherever
//instead of switch
myDictionary[t]();
}
}
我用类似的例子回答了类似的问题here。
另外,请尝试在switch语句中使用枚举而不是字符串。
答案 1 :(得分:4)
看看你是否可以使用接口和接口的不同实现来重构它。
public interface Test {
void DoSomething();
}
public class TestX : Test {
void DoSomething() {
}
}
public class TestY : Test {
void DoSomething() {
}
}
public class TestZ : Test {
void DoSomething() {
}
}
void func(Test test) {
test.DoSomething();
}
答案 2 :(得分:0)
当我试着理解你的问题时,我可能会去关注:
public enum Test{
X, Y, Z
}
/**
* test function call
* @a_Test - enumeration class for Test
*/
public void test(Test a_Test){
switch(a_Test){
case X:
x();
break;
case Y:
y();
break;
case Z:
z();
break;
}//switch
}//test
我希望它有所帮助。
虎