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

posted @ 2012-05-04 22:23  TODO  阅读(289)  评论(0)    收藏  举报