基本思想每个case的选择值作为键,处理过程做成函数委托存放进数据字典。用的时候根据之调用。下面上代码
封装的FuncSwitcher类
using System; using System.Collections.Generic; namespace Test { class FuncSwitcher<T> { int count; Dictionary<T, Delegate> FuncGather; Delegate defalutFunc; public FuncSwitcher() { count = 0; FuncGather = new Dictionary<T, Delegate>(); } /// <summary> /// 调用函数处理 /// </summary> /// <param name="t"></param> /// <param name="parameters"></param> /// <returns></returns> public object Invoke(T t, object[] parameters) { if (FuncGather.ContainsKey(t)) { var method = FuncGather[t]; return method.Method.Invoke(method, parameters); } else { var method = defalutFunc; return method.Method.Invoke(method, null); } } /// <summary> /// 添加默认处理函数 /// </summary> /// <param name="defaultFunc"></param> public void AddDefault(Delegate defaultFunc) { this.defalutFunc = defaultFunc; } /// <summary> /// 添加键值对 /// </summary> /// <param name="key"></param> /// <param name="func"></param> public void AddFunc(T key, Delegate func) { FuncGather.Add(key, func); } /// <summary> /// 添加多对键值 /// </summary> /// <param name="funcs"></param> public void AddRange(KeyValuePair<T, Delegate>[] funcs) { foreach (KeyValuePair<T, Delegate> func in funcs) { FuncGather.Add(func.Key, func.Value); } } /// <summary> /// 移除键值对 /// </summary> /// <param name="t"></param> public void Remove(T t) { FuncGather.Remove(t); } /// <summary> /// 获取函数 /// </summary> /// <param name="t"></param> /// <returns></returns> public Delegate GetFunc(T t) { return FuncGather[t]; } /// <summary> /// 是否包含键 /// </summary> /// <param name="t"></param> /// <returns></returns> public bool ContainKey(T t) { if (FuncGather.ContainsKey(t)) return true; else return false; } /// <summary> /// 是否包含值 /// </summary> /// <param name="t"></param> /// <returns></returns> public bool ContainValue(Delegate t) { if (FuncGather.ContainsValue(t)) return true; else return false; } /// <summary> /// 清空键值 /// </summary> public void Clear() { FuncGather.Clear(); count = 0; } public int Count { get { return count; } } } }
测试用的函数,我最偏好的加减乘除,用什么其实都无所谓。
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Configuration; using System.Diagnostics; namespace Test { class Program { static void Main(string[] args) { FuncSwitcher<ConsoleKey> Switcher = new FuncSwitcher<ConsoleKey>(); ConsoleKeyInfo flag; Switcher.AddFunc(ConsoleKey.D0, new Action(() => { SwitchTest(); })); Switcher.AddFunc(ConsoleKey.D1, new Action(() => { CustomSwitchTest(); })); Switcher.AddFunc(ConsoleKey.D2, new Action(() => { Console.WriteLine("程序已经退出"); Environment.Exit(0); })); Switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); })); while (true) { Console.WriteLine("********************************"); Console.WriteLine("***** 0:switch测试 ******"); Console.WriteLine("***** 1: CustomSwitchTest******"); Console.WriteLine("***** 2: 退出程序 ******"); Console.WriteLine("********************************"); flag = Console.ReadKey(); Console.WriteLine(); Switcher.Invoke(flag.Key, null); } } /// <summary> /// switch/case /// </summary> public static void SwitchTest() { Console.WriteLine("********************"); Console.WriteLine("***** add:加 ****"); Console.WriteLine("***** sub: 减 ****"); Console.WriteLine("***** mul: 乘 ****"); Console.WriteLine("***** div: 除 ****"); Console.WriteLine("***** 0:返回 ****"); Console.WriteLine("********************"); Console.WriteLine("输入操作"); string operate = Console.ReadLine(); switch (operate) { case "add": Console.WriteLine(Add(1, 1)); break; case "sub": Console.WriteLine(Sub(1, 1)); break; case "mul": Console.WriteLine(Mul(1, 1)); break; case "div": Console.WriteLine(Div(1, 1)); break; default: Console.WriteLine("重新输入"); break; } } /// <summary> /// 自定义的选择 /// </summary> public static void CustomSwitchTest() { FuncSwitcher<string> switcher = new FuncSwitcher<string>(); switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); })); switcher.AddRange(new KeyValuePair<string, Delegate>[] { new KeyValuePair<string,Delegate>("add", new Func<int,int,int>(Add)), new KeyValuePair<string,Delegate>("sub", new Func<int,int,int>(Sub)), new KeyValuePair<string,Delegate>("mul", new Func<int,int,int>(Mul)), new KeyValuePair<string, Delegate>("div", new Func<int, int, int>(Div)), }); Console.WriteLine("********************"); Console.WriteLine("***** add:加 ****"); Console.WriteLine("***** sub: 减 ****"); Console.WriteLine("***** mul: 乘 ****"); Console.WriteLine("***** div: 除 ****"); Console.WriteLine("***** 0:返回 ****"); Console.WriteLine("********************"); Console.WriteLine("输入操作"); string operate = Console.ReadLine(); Console.WriteLine(switcher.Invoke(operate, new object[] { 1, 1 })); } /// <summary> /// 测试所用,无所谓了,什么函数都可以的 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public static int Add(int x, int y) { return x + y; } public static int Sub(int x, int y) { return x - y; } public static int Mul(int x, int y) { return x * y; } public static int Div(int x, int y) { if (y != 0) return x / y; else throw new DivideByZeroException("除数不可以为0"); } } }
时间: 2024-10-23 19:16:13