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

简介:

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)

相关文章
|
存储 数据可视化 关系型数据库
Apache Doris-部署
建议使用使用 Docker 开发镜像编译
1455 0
Apache Doris-部署
|
存储 设计模式 前端开发
Streamlit应用中构建多页面(三):两种方案(上)
Streamlit应用中构建多页面(三):两种方案
4237 0
|
11月前
|
设计模式 缓存 Java
「全网最细 + 实战源码案例」设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对目标对象的访问并添加额外功能。它分为静态代理和动态代理,后者包括JDK动态代理和CGLIB动态代理。JDK动态代理基于接口反射生成代理类,而CGLIB通过继承目标类生成子类。代理模式适用于延迟初始化、访问控制、远程服务、日志记录和缓存等场景,优点是职责分离、符合开闭原则和提高安全性,缺点是增加系统复杂性。
276 25
|
SQL
UNIQUE
【11月更文挑战第14天】
533 6
|
存储 前端开发 数据库
一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
【10月更文挑战第21天】本文介绍了 SaaS 应用服务的多租户服务、安全服务和更新与维护服务,以及 SaaS 应用的前后端结构和交互设计。多租户服务涉及数据隔离和资源分配;安全服务包括身份认证与授权及数据安全;更新与维护服务涵盖版本管理和技术支持。前端结构关注用户界面设计和前端技术选型;后端结构则涉及微服务架构和数据库管理。交互设计强调租户与应用的交互和应用内部模块间的交互。
1162 0
|
Ubuntu Java Docker
docker 搭建私有仓库并发布私有镜像
docker 搭建私有仓库并发布私有镜像
1116 1
|
JavaScript
js 排序—— sort() 对普通数组、对象数组(单属性/多属性)排序
js 排序—— sort() 对普通数组、对象数组(单属性/多属性)排序
458 0
|
缓存 算法 Java
提升编程效率的利器: 解析Google Guava库之常用工具类-40个示例(七)
提升编程效率的利器: 解析Google Guava库之常用工具类-40个示例(七)
|
云安全 存储 运维
云安全介绍
云安全概念介绍
438 0
|
Ubuntu 应用服务中间件 nginx
docker容器数据持久化
docker 容器内的数据是独立于镜像之外的,那么如何将其持久化到宿主机呢?答案便是利用「数据卷」,那什么又是「数据卷」呢?

热门文章

最新文章