创建对静态类中一组方法的访问代理-阿里云开发者社区

开发者社区> 最美的回忆> 正文

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

简介:
+关注继续查看

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

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

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

偶写了一个实现Demo:

 1None.gifusing System;
 2None.gif
 3None.gifnamespace DelegateTest
 4ExpandedBlockStart.gif{
 5InBlock.gif    class MainClass
 6ExpandedSubBlockStart.gif    {
 7InBlock.gif
 8InBlock.gif        [STAThread]
 9InBlock.gif        static void Main(string[] args)
10ExpandedSubBlockStart.gif        {
11InBlock.gif            WhoAmIDelegate d1=DelegateFactory.CreateWhoAmIDelegate("DelegateTest.ClassA");
12InBlock.gif            WhoAmIDelegate d2=DelegateFactory.CreateWhoAmIDelegate("DelegateTest.ClassB");
13InBlock.gif
14InBlock.gif            Console.WriteLine(d1());
15InBlock.gif            Console.WriteLine(d2());
16InBlock.gif
17InBlock.gif            long start,end;
18InBlock.gif            int loops = 100000000;
19InBlock.gif
20InBlock.gif            start=DateTime.Now.Ticks;
21InBlock.gif            for(int i=0;i<loops;i++)
22ExpandedSubBlockStart.gif            {
23InBlock.gif                ClassA.WhoAmI();
24ExpandedSubBlockEnd.gif            }

25InBlock.gif            end = DateTime.Now.Ticks;
26InBlock.gif            Console.WriteLine("{0}次直接调用ClassA.WhoAmI耗时:{1}ms",loops,(end-start)/10000);
27InBlock.gif
28InBlock.gif            start=DateTime.Now.Ticks;
29InBlock.gif            for(int i=0;i<loops;i++)
30ExpandedSubBlockStart.gif            {
31InBlock.gif                d1();
32ExpandedSubBlockEnd.gif            }

33InBlock.gif            end = DateTime.Now.Ticks;
34InBlock.gif            Console.WriteLine("{0}次调用WhoAmIDelegate耗时:{1}ms",loops,(end-start)/10000);
35InBlock.gif
36ExpandedSubBlockEnd.gif        }

37ExpandedSubBlockEnd.gif    }

38InBlock.gif
39InBlock.gif
40InBlock.gif    public delegate string WhoAmIDelegate();
41InBlock.gif
42InBlock.gif
43InBlock.gif    public class ClassA
44ExpandedSubBlockStart.gif    {
45InBlock.gif        //方法很丑陋,嘿嘿。为了性能测试方便嘛。
46InBlock.gif        public static string WhoAmI()
47ExpandedSubBlockStart.gif        {
48InBlock.gif            return "ClassA";
49ExpandedSubBlockEnd.gif        }

50ExpandedSubBlockEnd.gif    }

51InBlock.gif
52InBlock.gif    public class ClassB
53ExpandedSubBlockStart.gif    {
54InBlock.gif        public static string WhoAmI()
55ExpandedSubBlockStart.gif        {
56InBlock.gif            return "ClassB";
57ExpandedSubBlockEnd.gif        }

58ExpandedSubBlockEnd.gif    }

59InBlock.gif
60InBlock.gif    public class DelegateFactory
61ExpandedSubBlockStart.gif    {
62InBlock.gif        public static WhoAmIDelegate CreateWhoAmIDelegate(string className)
63ExpandedSubBlockStart.gif        {
64InBlock.gif            return (WhoAmIDelegate)Delegate.CreateDelegate(Type.GetType("DelegateTest.WhoAmIDelegate"),Type.GetType(className),"WhoAmI");
65ExpandedSubBlockEnd.gif        }

66ExpandedSubBlockEnd.gif    }

67ExpandedBlockEnd.gif}

68None.gif


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)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
单元测试不可测试那些类(无抽象、静态类、静态方法)
实际上“单元测试不可测试那些类(无抽象、静态类、静态方法)”是个伪命题,因为事实是:无抽象、静态类、静态方法都是不可单元测试的。那么,如果我们要写出可测试的代码,又要用到这些静态类等,该怎么办,实际上我们需要两个步骤: 1:为它们写一个包装类,让这个包装类是抽象的(继承自接口,或者抽象类,或者方法本身是Virtual的); 2:通知客户端程序员,使用包装类来代替原先的静态类来写业务逻辑; 实际上,微软也是这么干的,我在上一篇博文《单元测试WebForm的UI逻辑及文件上传》写到,最典型的不可测试类,那就是WebForm架构的网站中,对Response等的模拟。
585 0
JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类
JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 一.Object类 Object是什么呢?我们可以翻阅JAVA API文档看他的介绍 上面介绍说,object是类层次结构的根类,也就是超类 Ob.
1190 0
[C#]如何访问及调用类中私有成员及方法
原文:[C#]如何访问及调用类中私有成员及方法 本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.
964 0
JSP-讲解(生成java类、静态导入与动态导入)
一、JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护。 JSP是HTML代码与Java代码的混合体。 JSP文件通常以JSP或JSPX的扩展名。
1138 0
codeblocks创建和使用静态库(C语言)
静态库  (扩展名为 .a 或 .lib) 是包含函数的文件,用于在link阶段整合执行程序,动态链接库(扩展名  .dll)是不在link阶段整合进执行程序中的。 DLL文件在执行阶段动态调用 下面我们将用免费的开发工具CodeBocks开发静态库 创建静态库 启动Codeblocks并创建一个类型为 "Static Library" (File/New/Project/Static Library/Go)的项目。
983 0
2286
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载