源码发布 - DynamicMethodProxyFactory组件

在前面的文章改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现中,提到了一种通过DynamicMethod以非泛型方法代理访问泛型方法的较佳方法(无额外代码定义需要,执行时间大约相当于直接调用泛型方法的3-4倍)。本文介绍的组件在前文思路的基础上,进行进一步的扩展,封装成一个较通用的DynamicMethodProxyFactory组件。除了可以较高性能访问任意的静态或非静态、泛型或非泛行方法之外,利用DynamicMethod可将代码插入内存中已载入的Module的能力,提供了在程序集外实例化指定Module中的internal类型,在程序集外调用internal类型的方法和public类型的internal方法的支持。

该组件实现如下功能:
1、以通用的非泛行方法Delegate访问任意方法(泛型或非泛型,静态或非静态);
2、支持在程序集外调用指定Module中的internal类型的任意属性(属性本质上可以通过它的get/set方法以方法的形式访问)和方法和public类型的internal方法;
3、支持创建并返回指定Module中的internal类型的实例;

以非泛型方式调用泛型方法的意义在前文中已经讨论过了,对很多支持泛型方法的框架来说,是非常必要的代替反射的功能(相比反射性能提升3-4个数量级)。

那么访问internal类型和方法有什么意义呢?除了突破原来的CLR的不能跨程序集访问internal成员的限制这个明显的好处之外,更大的意义在于我们可以使用.Net Framework提供的很多非常有用的internal组件,这些组件,MS出于各种原因标记为了internal,但是,既然提供了,我们就有理由去使用它,对于实现我们自己的组件时充分利用.Net Framework内置的这些组件而减少我们重复劳动的工作量也很有意义。


使用演示:

 1using System;
 2using System.Collections.Generic;
 3using System.Reflection;
 4using System.Reflection.Emit;
 5using System.Text;
 6
 7namespace DynamicMethodProxyTest
 8{
 9    public class Program
10    {
11        //用于测试的静态方法
12        public static void Add<T>(T obj, IList<T> list)
13        {
14            //list.Add同时也是用于测试的非静态方法
15            list.Add(obj);
16        }

17
18        private const int REPEAT_TIME = 20000000;
19
20        static void Main(string[] args)
21        {
22            //创建一个内置缓存支持的DynamicMethodProxyFactory实例
23            NBear.DynamicMethodHelper.DynamicMethodProxyFactory fac = new NBear.DynamicMethodHelper.CachableDynamicMethodProxyFactory();
24
25            //创建一个internal的System.Web.HttpDictionary类实例
26            Console.WriteLine("Create an instance of internal type - System.Web.HttpDictionary.");
27            object temp = fac.CreateInstance(typeof(System.Web.HttpApplication).Module, "System.Web.HttpDictionary"falsefalse);
28
29            //创建访问该实例的SetValue和GetValue方法的DynamicMethosProxyDelegate
30            Console.WriteLine("Create DynamicMethodProxyDelegate of HttpDictionary's SetValue and GetValue methods.");
31            NBear.DynamicMethodHelper.DynamicMethodProxyDelegate setDelegate = fac.GetMethodDelegate(typeof(System.Web.HttpApplication).Module, temp.GetType().GetMethod("SetValue", BindingFlags.NonPublic | BindingFlags.Instance));
32            NBear.DynamicMethodHelper.DynamicMethodProxyDelegate getDelegate = fac.GetMethodDelegate(typeof(System.Web.HttpApplication).Module, fac.GetMethodInfoBySignature(temp.GetType(), "System.Object GetValue(System.String)"falsefalse));
33
34            //在该实例上 Set & Get 测试数据
35            Console.WriteLine("set \"test value\" on the internal type instance");
36            setDelegate(temp, "test""test value");
37            Console.WriteLine("get the test value from the internal type instance: " + getDelegate(temp, "test"));
38
39            //测试DynamicMethodProxyDelegate的性能
40            Console.WriteLine("Test the performance of DynamicMethodProxyDelegate.");
41            List<int> list = new List<int>();
42            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
43            watch.Reset();
44            watch.Start();
45            for (int i = 0; i < REPEAT_TIME; i++)
46            {
47                //这里是直接泛型调用
48                Program.Add<int>(i, list);
49            }

50            watch.Stop();
51            long l1 = watch.ElapsedMilliseconds;
52            watch.Reset();
53            MethodInfo mi = typeof(Program).GetMethod("Add");
54            //创建一个静态方法的StaticDynamicMethodDelegate
55            NBear.DynamicMethodHelper.StaticDynamicMethodProxyDelegate sdmd = fac.GetStaticMethodDelegate(mi, typeof(int));
56            watch.Start();
57            for (int i = 0; i < REPEAT_TIME; i++)
58            {
59                //通过StaticDynamicMethodDelegate以非泛型方式访问泛型方法
60                sdmd(i, list);
61            }

62            watch.Stop();
63            long l2 = watch.ElapsedMilliseconds;
64            watch.Reset();
65            MethodInfo mi2 = list.GetType().GetMethod("Add");
66            //创建一个DynamicMethodDelegate访问同样的Add方法
67            NBear.DynamicMethodHelper.DynamicMethodProxyDelegate dmd = fac.GetMethodDelegate(mi2);
68            watch.Start();
69            for (int i = 0; i < REPEAT_TIME; i++)
70            {
71                //通过DynamicMethodDelegate访问
72                dmd(list, i);
73            }

74            watch.Stop();
75            long l3 = watch.ElapsedMilliseconds;
76            Console.WriteLine("{0}\nDirectly vs Static vs Non-static\n{1} vs {2} vs {3}", list.Count, l1, l2, l3);
77            Console.ReadLine();
78        }

79    }

80}


下载测试代码和类库源码

posted @ 2007-03-28 11:10 Teddy's Knowledge Base Views(7780) Comments(24) Edit 收藏

 回复 引用 查看   
#1楼2007-03-28 12:20 | henry      
下载研究一下!
不过自己在实际开发通常使用接口约定来尽可能地绕开这种需求的处理,但始终有时要面对这样的问题.

 回复 引用   
#2楼2007-03-28 17:59 | firefox[未注册用户]
好东西
 回复 引用   
#3楼2007-03-28 20:29 | duhaha[未注册用户]
让你充满创意 http://***
 回复 引用   
#4楼2007-03-28 20:38 | kris[未注册用户]
teddy出品,必属佳品
 回复 引用   
#5楼2007-03-30 00:26 | 上网助手[未注册用户]
不错的说。
 回复 引用   
#7楼2007-07-15 08:05 | 火狐[未注册用户]
谢谢楼主发源码给大家
 回复 引用   
#8楼2007-07-15 08:06 | 火狐[未注册用户]
请大家不要乱发无关的东西阿~~
 回复 引用   
#9楼2007-07-15 08:06 | 火狐[未注册用户]
基于NBear的快速开发解决方案
 回复 引用   
#10楼2007-07-20 10:14 | oxsoft.cn[未注册用户]
看看
 回复 引用   
#11楼2007-08-20 06:39 | DHC[未注册用户]
不太同意
 回复 引用   
#12楼2007-08-25 10:44 | 安利[未注册用户]
受教了,感谢版主
 回复 引用   
#13楼2007-10-11 12:59 | 火狐[未注册用户]
好好
 回复 引用   
#14楼2007-10-11 13:00 | 火狐[未注册用户]
haha
 回复 引用   
#15楼2007-10-14 21:20 | dhc[未注册用户]
有意思 顶一个

 回复 引用 查看   
#16楼2007-10-18 14:19 | 阿不      
不能支持对私有变量进行赋值吗?
好东东,顶啦!
好文章哦
 回复 引用   
#19楼2007-10-22 01:27 | 网赚论坛[未注册用户]
看不懂啊
 回复 引用   
#20楼2007-11-29 18:56 | 火狐浏览器[未注册用户]
我知道了
 回复 引用 查看   
#21楼2007-12-09 13:53 | 蛙蛙池塘      
为什么不可以修改.net fx里internal方法的实现,而只能调用呀
 回复 引用   
#22楼2008-03-31 16:00 | sssa[未注册用户]
维创多用户商城7.8SQL商业版提供下载
下载名称: 维创多用户商城7.8SQL商业版
软件大小: 8.57M
适用环境: ASP+MSSQL数据库
发布时间: 2008年3月22日
下载类别: 商城系统
下载地址: http://shop.vcidc.com/DOWN.ASP?DOWN=C1DE871F653367B7CB4ADDCD67594D63" target="_new" rel="nofollow">http://shop.vcidc.com/DOWN.ASP?DOWN=C1DE871F653367B7CB4ADDCD67594D63
官 方 网:http://www.onshp.com 手机访问wap.onshp.com
维创开发者:http://shop.vcidc.com
我们之所有推出这样高的商业版本免费发布?

原因只有一个,中国的电子商务市场巨大,有很大一部分阿里巴巴和淘宝的追随者或想从事电子商务投资创业的人,由于前期资金、技术等原因

很难那立一个高标准的电子商务网站,为了让这部分人能用上商城和培养中国更多的电子商务创业者,我们特发了目前为止维创互联发布的最高商城免费版本.

1、维创多用户商城7.8提供网上商店多店平台给电子商务服务提供商(运营商);
2、运营商提供网上开店服务,吸引中小型商家网上自助建店;
3、最终客户浏览中小型商家的网上商店,实现网络购物;
4. 自定服务品牌,独立经营,本系统运营者可以自定品牌、自主开通商店、对每个商店进行管理和授权,完全独立经营!
5. 每个商店相对独立,互不干扰,安全性好,通过本系统开通的每一个商店都使用独立域名。每个商店都有独立的管理权限控制体系。
6. 多店模版丰富、功能强大、通用性强,适合建立各种商店,商店系统使用的是改进后的网上商店系统v7.8版本,功能强大。可以开发更多的商店模版。商店系统对不同的商品特性可以使用不同的个性模版,并可指定不同的商品属性列,因此适合建立各种类型的商店,用户群很广。
7. 完备的试用、开通和控制体系,本系统运营者可以设置默认的试用时间、试用时是否可直接访问、试用时空间限制、向商城发布商品时是否审核等试用参数;可以对每一个商店设置到期时间、商品多少、许可向商城发布商品数量等参数,用来制定多种建店套餐。使用在线支付还可以实时开通商店。
8. 商城主站内容丰富、功能强大、交互性强,多用户商城主站不仅具备管理下属商店和推荐商品的功能,同时也具备多模版新闻系统、商务社区等内容管理功能和商店购物的全部功能,也可以直接销售自备商品。另外,多用户商城系统主站特别加强了新闻、商品栏目的内容交互功能,使多用户商城主站更具大站风范。
由于说明都是简要,更多细节功能还请自己体验.

http://shop.vcidc.com/down/8.20网站首页截图.jpg

http://shop.vcidc.com/images/03.jpg