WEB开发网
开发学院软件开发Python 轻量级AOP框架-移植python的装饰器(Decorator)到C... 阅读

轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)

 2010-01-08 00:00:00 来源:WEB开发网   
核心提示: 这样一来形式就和Python的Decorator大致一样了,然而,轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)(4),在正常情况下,C#是不会像Python一样自动处理 LoggerAttribute和Test的关系的,对Python的Decorator进行一

这样一来形式就和Python的Decorator大致一样了,然而,在正常情况下,C#是不会像Python一样自动处理 LoggerAttribute和Test的关系的,因此,LoggerWrapper永远也没法执行,更不用说替换Test方法了,于是,下面我们需要继续考虑具体功能的实现。

四. 考虑功能的实现

要实现Decorator,很重要的一点就是能做到对方法“偷梁换柱”,而C#在运行期是不能修改方法的。当然,Decorator本质上是一种AOP的表现形式,因此,我们大可考虑AOP常见的实现方式。AOP一般有动态代理和静态织入两种实现方式,动态代理虽然有一些小小的限制,但是相比静态织入,实现和使用上都大大简单化,因此,我们考虑使用动态代理的方式实现该功能。

对于MyClass类,我们希望能生成一个新的MyClassWrapper类,该类继承自MyClass,同时,我们要求将Test方法修改成 virtual方法,这样,我们可以在MyClassWrapper类中对Test方法进行改写,这样以来就达到了对方法“偷梁换柱”的做法,虽然比起 Python不够利索,但是能满足我们的要求也是大大的欢迎。那么,我们的MyClassWrapper类要求如下定义:

1 public class MyClassWrapper : MyClass {
2     public override string Test() {
3         LoggerAttribute attribute =
4 typeof(MyClass).GetMethod(“Test”).GetCustomAttribute(typeof(LoggerAttribute), true)[0] as LoggerAttribute; //获取基类中的第一个LoggerAttribute
5         //调用LoggerWrapper方法,获取新的委托.
6         var fun = attribute.LoggerWrapper(new TestMethodDelegate(Test));
7         return fun();
8     }
9 }

这样一来,我们就改写了Test方法的实现,达到和Python中的Decorator一致的效果。然而,C#的这种处理方式还是和Python有不同的,在Python中,是Decorator函数替换掉被装饰函数,但是在C#中,因为方法不能被另一个委托对象替换,我们只能在方法内部手动执行装饰过的方法,不过,效果是完全一致的。当然,上面的例子只是代表了一种实现的方法,在多个Attribute的情况下还需要很多不同的处理,不过,这样就代表在C#上实现python的Decorator是完全行得通的。

在上面的例子中,我们针对Test方法做到了装饰,但是,作为一个框架,我们要求能对所有满足要求的方法都能实现装饰,因此,我们需要对上面的实现进行修改。很重要的一点,我们上面的装饰器仅仅能处理string Test(string)这样的方法,如果是string Test(object)我们则需要重新定义,使用可是大大的不便,于是,考虑用一种通用的方法签名来代表所有的方法调用,也就是使用 Func<object, object[], object>来代表任意方法。

五. 本篇小结

在本篇中,我们将Python中Decorator的原理进行了透彻的分析,同时评估了在C#实现同样的Decorator的可行性,通过分析可以肯定,在C#上,通过一定的技术手段,我们完全可以实现和Python类似的Decorator功能。

在下一篇中,文章将从具体实践出发,对Python的Decorator进行一个完整的移植,因此,下一篇将暂定名为“编码篇”。

上一页  1 2 3 4 

Tags:轻量级 AOP 框架

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接