创建对静态类中一组方法的访问代理

tygtug@newsmth.net发文询问“能创建一个对静态类中的一组方法的访问代理吗?”

“某些类都有一组静态方法
现在想在运行时传入类名
根据类名决定执行相应的类的静态方法。
类似于指定一个类的变量似的。”

“涉及到对旧有代码的改造时的折中考虑,才会有这个需要的,不能把问题归于类的结构涉及
不合理而搪塞阿。”

偶写了一个实现Demo:

 1创建对静态类中一组方法的访问代理using System;
 2创建对静态类中一组方法的访问代理
 3创建对静态类中一组方法的访问代理namespace DelegateTest
 4创建对静态类中一组方法的访问代理{
 5创建对静态类中一组方法的访问代理    class MainClass
 6创建对静态类中一组方法的访问代理    {
 7创建对静态类中一组方法的访问代理
 8创建对静态类中一组方法的访问代理        [STAThread]
 9创建对静态类中一组方法的访问代理        static void Main(string[] args)
10创建对静态类中一组方法的访问代理        {
11创建对静态类中一组方法的访问代理            WhoAmIDelegate d1=DelegateFactory.CreateWhoAmIDelegate("DelegateTest.ClassA");
12创建对静态类中一组方法的访问代理            WhoAmIDelegate d2=DelegateFactory.CreateWhoAmIDelegate("DelegateTest.ClassB");
13创建对静态类中一组方法的访问代理
14创建对静态类中一组方法的访问代理            Console.WriteLine(d1());
15创建对静态类中一组方法的访问代理            Console.WriteLine(d2());
16创建对静态类中一组方法的访问代理
17创建对静态类中一组方法的访问代理            long start,end;
18创建对静态类中一组方法的访问代理            int loops = 100000000;
19创建对静态类中一组方法的访问代理
20创建对静态类中一组方法的访问代理            start=DateTime.Now.Ticks;
21创建对静态类中一组方法的访问代理            for(int i=0;i<loops;i++)
22创建对静态类中一组方法的访问代理            {
23创建对静态类中一组方法的访问代理                ClassA.WhoAmI();
24创建对静态类中一组方法的访问代理            }

25创建对静态类中一组方法的访问代理            end = DateTime.Now.Ticks;
26创建对静态类中一组方法的访问代理            Console.WriteLine("{0}次直接调用ClassA.WhoAmI耗时:{1}ms",loops,(end-start)/10000);
27创建对静态类中一组方法的访问代理
28创建对静态类中一组方法的访问代理            start=DateTime.Now.Ticks;
29创建对静态类中一组方法的访问代理            for(int i=0;i<loops;i++)
30创建对静态类中一组方法的访问代理            {
31创建对静态类中一组方法的访问代理                d1();
32创建对静态类中一组方法的访问代理            }

33创建对静态类中一组方法的访问代理            end = DateTime.Now.Ticks;
34创建对静态类中一组方法的访问代理            Console.WriteLine("{0}次调用WhoAmIDelegate耗时:{1}ms",loops,(end-start)/10000);
35创建对静态类中一组方法的访问代理
36创建对静态类中一组方法的访问代理        }

37创建对静态类中一组方法的访问代理    }

38创建对静态类中一组方法的访问代理
39创建对静态类中一组方法的访问代理
40创建对静态类中一组方法的访问代理    public delegate string WhoAmIDelegate();
41创建对静态类中一组方法的访问代理
42创建对静态类中一组方法的访问代理
43创建对静态类中一组方法的访问代理    public class ClassA
44创建对静态类中一组方法的访问代理    {
45创建对静态类中一组方法的访问代理        //方法很丑陋,嘿嘿。为了性能测试方便嘛。
46创建对静态类中一组方法的访问代理        public static string WhoAmI()
47创建对静态类中一组方法的访问代理        {
48创建对静态类中一组方法的访问代理            return "ClassA";
49创建对静态类中一组方法的访问代理        }

50创建对静态类中一组方法的访问代理    }

51创建对静态类中一组方法的访问代理
52创建对静态类中一组方法的访问代理    public class ClassB
53创建对静态类中一组方法的访问代理    {
54创建对静态类中一组方法的访问代理        public static string WhoAmI()
55创建对静态类中一组方法的访问代理        {
56创建对静态类中一组方法的访问代理            return "ClassB";
57创建对静态类中一组方法的访问代理        }

58创建对静态类中一组方法的访问代理    }

59创建对静态类中一组方法的访问代理
60创建对静态类中一组方法的访问代理    public class DelegateFactory
61创建对静态类中一组方法的访问代理    {
62创建对静态类中一组方法的访问代理        public static WhoAmIDelegate CreateWhoAmIDelegate(string className)
63创建对静态类中一组方法的访问代理        {
64创建对静态类中一组方法的访问代理            return (WhoAmIDelegate)Delegate.CreateDelegate(Type.GetType("DelegateTest.WhoAmIDelegate"),Type.GetType(className),"WhoAmI");
65创建对静态类中一组方法的访问代理        }

66创建对静态类中一组方法的访问代理    }

67创建对静态类中一组方法的访问代理}

68创建对静态类中一组方法的访问代理


Debug下运行结果:
ClassA
ClassB
100000000次直接调用ClassA.WhoAmI耗时:961ms
100000000次调用WhoAmIDelegate耗时:3134ms

Release下运行结果:
ClassA
ClassB
100000000次直接调用ClassA.WhoAmI耗时:210ms
100000000次调用WhoAmIDelegate耗时:2964ms

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2005/08/09/211073.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

上一篇:TOAD 导出数据


下一篇:自动化日志收集及分析在支付宝 App 内的演进