RanceQuest1000001_KillSwitch2_万用无能型简称万能型_继承老赵的反射改良类;P
今天刚好有点时间,再加上后来突然想到要是需要switch当中的方法返回值怎么办?要是变成方法签名变成别的了怎么办?难不成每次都自己写一个?那太蠢啦。
于是翻开以前存的老赵点滴方法的直接调用,反射调用与……Lambda表达式调用~\(≧▽≦)/~啦啦啦。
public class KillSwitch2 { private Dictionary<string, DynamicMehtodExecutor> actions = new Dictionary<string, DynamicMehtodExecutor>(); public KillSwitch2(Type classType, string methodName) { var methods = classType.GetMethods(); DynamicMehtodExecutor executor; foreach (var method in methods) { string name = method.Name; if (name.StartsWith(methodName)) { executor = new DynamicMehtodExecutor(method); actions.Add(method.Name, executor); } } } public object TryAction(string key, object instance, object[] parameters) { var action = actions[key]; if (action == null) { throw new KeyNotFoundException("TryAction lose"); } else { return action.Execute(instance, parameters); } } }
如此可满足目前所学所知(当然也不排除明天又想到新的盲点继续迭代开发;P)
再补上测试代码
TestExample2_2 test2_2 = new TestExample2_2(); CodeTimer.Time("TestExample2_2 Static exe reflector", times, () => { test2_2.TryAction("FuncOne", null, null); });
环境与上一篇相同,【100W】次【空】方法【136】ms。虽然比直接调用switch的15ms慢了近10倍,但是
——不用解释啦,会自我尝试的人不用说,不会自我尝试的人更不用说;P

浙公网安备 33010602011771号