我們經常使用 switch 語句,如果case 不多,當然很好,簡單明了。但有時業務複雜 case 過多,幾十個以上 或者 后續經常有增加等情況的,那用switch case 就各種DANG疼.
以下簡單說下用委託 + 策略 解決這個問題.
string paraStr = "a";
//重點1,使用策略(约定接口名):傳入的參數與方法名一致 或有規則的聯系,假設傳入參數值為 "a" , 與方法a同名
//以下就是要取代的 switch case
//switch (paraStr)
//{
// case "a":
// a("aaa");
// break;
// case "b":
// b("bbb");
// break;
// case "c":
// c("ccc");
// break;
// //
// //下面假設還有好多 case,淩亂中 .......
//}
// 重點2:用委託鏈
Func<string, string> func = a;
func += b;
func += c;
//如果后續還有增加的方法,,,繼續加入到委託鏈中
//重點3:用GetInvocationList () ,并反射得到 委託鏈中方法的名稱,,與重點1 傳入參數關聯
var f = func.GetInvocationList().AsEnumerable().Where(o => o.GetMethodInfo().Name.Contains(paraStr)).FirstOrDefault();//using System.Reflection;
if (f != null) //如果找到該方法,執行
{
Console.WriteLine (f.DynamicInvoke("Get it."));
}
public static string a(string str)
{
Console.WriteLine("方法a");
return str + "方法a";
}
public static string b(string str)
{
Console.WriteLine("方法b");
return str + "方法b";
}
public static string c(string str)
{
Console.WriteLine("方法c");
return str + "方法c";
}
對于重點1的策略,也可以使用 Dictionary , enum,hashtablet,利用反射得到方法并執行(https://blog.csdn.net/segclliwf/article/details/116650593?spm=1001.2014.3001.5501)等,維護傳入參數與執行方法的聯系。