c# 2种反射应用在AOP方法上的比较

原创 2007年09月11日 23:20:00

虽然说, 在C#环境下也有了 成熟的spring 架构,但是涉及到AOP编程的时候,还是的自己写基于反射的实现,毕竟Spring只是一个框, 往里头装东西还的咱码代码的来,而那些功能实现如果还要走一层配置文件层的话那反而就更麻烦了. 因为项目上有涉及到 需要扩展调用到 RPC 并且调用前后都要 大量的log 各种日志 ....所以.试了些方法, 最后发现 自己直接.用反射的方式来处理类间的调用固然可以 而real proxy 的方式也可以 各有各的好坏和麻烦之处.

首先可以用 显式的直接用 emit 来 call然后前后加 功能函数的方式. 其实简单的例子够用了, 毕竟Spring的概念就是要简单简单再简单,codeproject上这个例子尽够了:

http://www.codeproject.com/dotnet/emithelper.asp

    emit
        // string.Format("Hello, {0} World!", toWhom)
        //
        ->ldstr   ("Hello, {0} World!")
        ->ldarg_1
        ->call    (String::typeid, "Format", String::typeid, Object::typeid)

        // Console.WriteLine("Hello, World!");
        //
        ->call    (Console::typeid, "WriteLine", String::typeid)
        ->ret()
        ;

而实际上写起来还是蛮费工夫的,因为你必须要自己写显式的call 被 emit的方法的 IL 代码 .然而也不是那么的没办法,因为毕竟有 ILDasm.exe 呢

另外一种就是用广义的反射 即real proxy的 interface 继承的方式来做了:


IMyType myType = ( IMyType )MyProxy(typeToProxy).GetTransparentProxy()
这样,在调用IMyType的接口method的时候。。。realproxy的invoke方法会被自动调用。。而我们可以重载invoke方法
public class MyProxy : public RealProxy


public override IMessage Invoke(IMessage msg)
{
IMethodCallMessage methodCall = msg as IMethodCallMessage;
LogFoo();  //------------------注入函数
IMessage msg = Invoke(methodCall);
LogBar();  //------------------注入函数
return msg;
}

protected override IMessage Invoke(IMethodCallMessage methodCall)
{
retVal = methodCall.MethodBase.Invoke(null, args);
ReturnMessage mret = new ReturnMessage(
                retVal,
                args,
                methodCall.ArgCount,
                methodCall.LogicalCallContext,
                methodCall);
            return mret;
}

广义上来说 .net这整套的把method call转换成message的过程都是反射相关的。但是不是直接的 而是语法里支持的 override 反射只是一种思路。。。具体什么应用方式。。就看发挥了。。。而这种方式具体的麻烦就在于代码量相当的不小

恩,现在坦白来说暂时没决定用啥

 

使用反射机制深入理解AOP机制并自定义AOP管理模块

先说说spring AOP使用上的一些限制: 1.如果切点函数有重载时,定义的通知类中方法不能实现方法重载 2.spring AOP只支持方法层面的切口定义,当然这个也是spring的基本原则如spr...
  • yangguo_2011
  • yangguo_2011
  • 2014年01月20日 20:56
  • 1235

java基础系列--反射与AOP实现

反射
  • yxinzju
  • yxinzju
  • 2015年08月29日 19:28
  • 1726

C#反射解析数据内容,调用方法

主要是分享C#中的一些处理方法: 1.反射获取成员值 2.反射获取未知类型成员内容 3.反射获取成员工具类 这部分主要是为了拿到实例的时候我们可能不清楚实例或成员的类型,但知道起成员的名称或需要拿到其...
  • Stephanie_1
  • Stephanie_1
  • 2017年03月29日 21:07
  • 486

C# 利用反射调用类下的方法

1.主窗体下的代码 namespace TestReflection { public partial class Form1 : Form { public For...
  • likekobe2012
  • likekobe2012
  • 2014年12月09日 15:12
  • 5807

C# 反射详解:定义、创建对象、调用实例方法及静态方法

C# 反射详解 定义 动态创建对象及调用实例方法 1、反射的定义及功能介绍:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会...
  • u014019959
  • u014019959
  • 2014年05月18日 16:31
  • 2675

C# 反射调用带参数的重载的泛型方法

C# 反射调用带参数的重载的泛型方法。 以及调用时抛出:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作异常的解决办法。 话不多说,上代码!...
  • CommandBaby
  • CommandBaby
  • 2016年04月29日 10:28
  • 2804

利用Java的反射与代理机制实现AOP

在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP。 一.AOP概述        A...
  • xybelieve1990
  • xybelieve1990
  • 2016年01月19日 17:10
  • 978

C#反射取得方法、属性、变量

C#反射(取得方法、属性、变量) 程序结构: 学生字典类(S0001): using System; using System.Collections.Generic; us...
  • kenkao
  • kenkao
  • 2015年11月23日 16:02
  • 4514

【点滴积累】在C#中使用反射动态调用类型成员

1.背景 学习C#的时候就知道使用反射可以对我们编程提供极大的便利(动态的获取信息、调用类型成员、创建实例等等),但是在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的WinForm...
  • dyllove98
  • dyllove98
  • 2013年06月09日 21:08
  • 1000

C#反射技术的简单操作(读取和设置类的属性)

public class A { public int Property1 { get; set; } } static void Main() { A aa = new A(); ...
  • jumtre
  • jumtre
  • 2015年01月28日 15:15
  • 1276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 2种反射应用在AOP方法上的比较
举报原因:
原因补充:

(最多只允许输入30个字)