轻量级AOP框架-移植python的装饰器(Decorator)到C#(编码篇)
2010-01-08 00:00:00 来源:WEB开发网对于第三步的类继承,很显然,这首先要具备一个条件,那就是原始类是可继承的,否则,也无从谈起TestClassWrapper的生成,如果满足条件,那么可以使用反射创建动态类。同时,在c#中,我们需要创建一个动态程序集来容纳这些动态类。
对于第四步,系统需要重写欲处理的方法,要达到这个目标,我们只能请出我们的终极大神MSIL了,在C#中,可以使用Emit的方式进行IL嵌入编程,虽然麻烦了点,但这总算也能高效的解决问题。
对于第五步,一般来说,可以调用Activator.CreateInstance方法来创建对象,然而,在本人的另一篇博客《探究.net对象的创建, 质疑《再谈Activator.CreateInstance(Type type)方法创建对象和Expression Tree创建对象性能的比较》中,我们可以了解到Activator.CreateInstance并不是最高效的做法,因此,框架将考虑使用更高效的方式,如Emit或者ExpressionTree的方式生成委托并构造对象。
四. 具体编码
在编码前,为了方便快速的构造框架,个人将一些成熟的代码放入框架中,以提高效率,这部分代码主要有:FastReflection,可以通过Emit快速构造方法调用委托,CodeGenerator,Nbear框架中的一个IL编程帮助类,通过它可以让我们简化不少IL操作。
现在万事俱备,我们开始一步步的创造框架吧,首先定义DecoratorFilter接口,以方便扩展Attribute,同时,为了方便,我们也定义一个DecoratorContexe来取代上篇中的直接传入Wrapper方法的委托对象,DecoratorFilter接口定义如下:
01 public interface IDecoratorFilter {
02 Func<object, object[], object> Execute(DecoratorContext context);
03 }
04 其中的DecoratorContext类包含了欲封装方法的基本属性,其定义如下:
05 public sealed class DecoratorContext {
06 /// <summary>
07 /// 该方法通用调用委托
08 /// </summary>
09 public Func<object, object[], object> Invoker { get; private set; }
10
11 /// <summary>
12 /// this对象
13 /// </summary>
14 public object Instanse { get; private set; }
15
16 /// <summary>
17 /// 方法参数列表
18 /// </summary>
19 public object[] Parameters { get; private set; }
20
21 public DecoratorContext(Func<object, object[], object> invoker, object instanse, object[] parameters) {
22 Invoker = invoker;
23 Instanse = instanse;
24 Parameters = parameters;
25 }
26 }
- ››AOP的两个应用:实体集更新(DateEntityListUpdate...
- ››AOP的两个应用:实体集更新(DateEntityListUpdate...
- ››轻量级数据交换格式 JSON轻松入门
- ››轻量级系统 Lubuntu 10.04 发布
- ››AOP 的利器:ASM 3.0 介绍
- ››轻量级AOP框架-移植python的装饰器(Decorator)到C...
- ››轻量级AOP框架-移植python的装饰器(Decorator)到C...
- ››轻量级开发的成功秘诀,第 4 部分: 轻量级容器的比...
- ››轻量级开发的成功秘诀,第 5 部分: 在保守公司进行...
- ››轻量级开发的成功秘诀,第 6 部分: 持久性策略
- ››轻量级开发的成功秘诀,第 7 部分: Java 替代方案...
- ››轻量级开发的成功秘诀,第 8 部分: Seaside
更多精彩
赞助商链接