zoukankan      html  css  js  c++  java
  • C#中Aop编程

    //程序源代码 

    //模型---------------------------------------------------------------------------------

    using System;
    using System.Runtime.CompilerServices;
    namespace module
    {
        
        /// <summary>
        /// 拦截器接口
        /// </summary>
        public interface Intercepter
        {
            /// <summary>
            /// 拦截器最后中调用表示目标对象 methodDelegate.Method.Invoke(methodDelegate.Target, args);
            /// </summary>
            /// <param name="methodName"></param>
            /// <param name="methodDelegate"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            Object Call(String methodName, MulticastDelegate methodDelegate, params Object[] args);
        }
       
      
        /// <summary>
        /// 需要动态产生的对象
        /// </summary>
        public sealed class IStudent_83523988 : IStudent
        {
            private Intercepter _intercepter;
            private delegatechangeNameHandler OnchangeName;
            private delegateEqualsHandler OnEquals;
            private delegateGetHashCodeHandler OnGetHashCode;
            private delegateGetTypeHandler OnGetType;
            private delegateToStringHandler OnToString;
            public IStudent_83523988(Intercepter intercepter1)
            {
                this._intercepter = intercepter1;
                this.OnchangeName = new delegatechangeNameHandler(this.callBack_OnchangeName);
                this.OnToString = new delegateToStringHandler(this.callBack_OnToString);
                this.OnEquals = new delegateEqualsHandler(this.callBack_OnEquals);
                this.OnGetHashCode = new delegateGetHashCodeHandler(this.callBack_OnGetHashCode);
                this.OnGetType = new delegateGetTypeHandler(this.callBack_OnGetType);
            }
            private void callBack_OnchangeName(string text1)
            {
                base.changeName(text1);
            }
            private bool callBack_OnEquals(object obj1)
            {
                return base.Equals(obj1);
            }
            private int callBack_OnGetHashCode()
            {
                return base.GetHashCode();
            }
            private Type callBack_OnGetType()
            {
                return base.GetType();
            }
            private string callBack_OnToString()
            {
                return base.ToString();
            }
            public override void changeName(string text1)
            {
                this._intercepter.Call("changeName", this.OnchangeName, new object[] { text1 });
            }
            public override bool Equals(object obj1)
            {
                return (bool)this._intercepter.Call("Equals", this.OnEquals, new object[] { obj1 });
            }
            public override int GetHashCode()
            {
                return (int)this._intercepter.Call("GetHashCode", this.OnGetHashCode, new object[0]);
            }
            
            /*
            public override Type GetType()
            {
                return (Type)this._intercepter.Call("GetType", this.OnGetType, new object[0]);
            }*/
            public override string ToString()
            {
                return (string)this._intercepter.Call("ToString", this.OnToString, new object[0]);
            }
            private delegate void delegatechangeNameHandler(string s);
            private delegate bool delegateEqualsHandler(object obj);
            private delegate int delegateGetHashCodeHandler();
            private delegate Type delegateGetTypeHandler();
            private delegate string delegateToStringHandler();
                   
        }
        /// <summary>
        /// 目标对象
        /// </summary>
        public class IStudent
        {
            public virtual void changeName(string newname)
            {
                Console.WriteLine("名字修改为:" + newname);
            }
        }
       
        public class test
        {
            public void TestMethod1()
            {
                /*
                AOP.DynamicProxyBuilder dymProxy = new AOP.DynamicProxyBuilder(typeof(IStudent), new LogIntercepter());
                IStudent s = (IStudent)dymProxy.CreateProxyClass();
                s.changeName("mxhzmm");
                 * */
                IStudent_83523988 s = new IStudent_83523988(new LogIntercepter());            
                s.changeName("mxh");
            }
        }
        /// <summary>
        /// 拦截器实现类
        /// </summary>
        public class LogIntercepter : Intercepter
        {
            public object Call(string methodName, MulticastDelegate methodDelegate, params object[] args)
            {
                Console.WriteLine("拦截器做了某些处理");
                return methodDelegate.Method.Invoke(methodDelegate.Target, args);
            }
        }

     //--------------------------------------------------------------------------

    //IStudent_83523988 的动态创建

     //-------------------------------------------------------------------------- 

     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.Reflection.Emit;
    namespace AOP
    {
        /*
        public interface Intercepter
        {
            public Object Call(String methodName, MulticastDelegate methodDelegate, params Object[] args)
            {
                return methodDelegate.Method.Invoke(methodDelegate.Target, args);
            }
        }
        */
        public interface Intercepter
        {
            /// <summary>
            /// 拦截器最后中调用表示目标对象 methodDelegate.Method.Invoke(methodDelegate.Target, args);
            /// </summary>
            /// <param name="methodName"></param>
            /// <param name="methodDelegate"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            Object Call(String methodName, MulticastDelegate methodDelegate, params Object[] args);
        }
        public class DynamicProxyBuilder
        {
            /// <summary>
            /// 拦截器
            /// </summary>
            Intercepter intercepter;
            Type m_type_delegate;
            /// <summary>
            /// 构造器
            /// </summary>
            /// <param name="t">目标对象</param>
            /// <param name="icpt">拦截器</param>
            public DynamicProxyBuilder(Type t,Intercepter icpt)
            {            
                try
                {
                    intercepter = icpt;
                    m_Type = t;
                    InitModule();
                    GenerateType();
                    GenerateMethodDelegateClass();
                    GentrateMethodDelegateEvent();
                    GenerateCallBackMethods();
                    GentrateOverrideMethods();
                    GenerateConstructor();
                    m_type_delegate=m_TypeBuilder.CreateType();
                    m_AssemblyBuilder.Save("DynamicProxy.dll");
                }
                catch (Exception err)
                {
                    throw err;
                }
            }
            public Object CreateProxyClass()
            {
                return Activator.CreateInstance(m_type_delegate, intercepter);
            }
            //assembly-module-(class、interface等)
            private ModuleBuilder m_ModuleBuilder;//创建Module
            private AssemblyBuilder m_AssemblyBuilder;//创建Assembly
            //
            /// <summary>
            /// 创建一个Assembly,在Assembly中创建一个module
            /// module中可以创建类、接口、属性、方法和变量等
            /// </summary>
            private void InitModule()
            {
                //
                AppDomain domain = AppDomain.CurrentDomain;
                AssemblyName asmName = new AssemblyName("DynamicModule");
                m_AssemblyBuilder = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
                m_ModuleBuilder = m_AssemblyBuilder.DefineDynamicModule("Module", "DynamicProxy.dll");           
            }
            /// <summary>
            /// 被代理类
            /// </summary>
            private Type m_Type;//被代理类
            /// <summary>
            /// 代理类构建器
            /// </summary>
            private TypeBuilder m_TypeBuilder;//代理类        
            /// <summary>
            /// 在module中添加类,在Emit中 类和接口 用Type
            /// 通过TypeAttributes制定具体的行为
            /// </summary>
            private void GenerateType()
            {
                //用被代理类的名字+"_"+哈希值作为代理类的名字,从被代理类继承一个不可以被继承(TypeAttributes.Sealed)公有(TypeAttributes.Public)的代理类(TypeAttributes.Class)
                m_TypeBuilder = m_ModuleBuilder.DefineType(m_Type.Name +"_" + m_Type.GetHashCode().ToString(),
                    TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed, m_Type);
                //m_TypeBuilder.CreateType();
            }
            /// <summary>
            /// 所有方法的代理
            /*
             * public sealed class Method_delegate : MulticastDelegate
                {
                    public Method_delegate(object local, IntPtr i);
                    public override void Invoke(string str);
                }
             * Invoke参数就是Method的参数
             * */
            /// </summary>
            private TypeBuilder[] m_methodDelegates;
            private ConstructorBuilder[] m_constructOfmethodDelegates;
            /// <summary>
            /// 为每一个方法创建一个代理
            /// </summary>
            private void GenerateMethodDelegateClass()
            {
                MethodInfo[] methodInfos = m_Type.GetMethods();//获取被代理类的所有public方法
                m_methodDelegates=new TypeBuilder[methodInfos.Length];
                m_constructOfmethodDelegates = new ConstructorBuilder[methodInfos.Length];
                ConstructorBuilder[] methodDelegateConstructs=new ConstructorBuilder[methodInfos.Length];//构造函数
                for (int i = 0; i < m_methodDelegates.Length; i++)
                {
                    //private delegate Type delegateMethodHandler(Type[]) 类似public delegate string delegateChangeNameHandler(string abc);
                    m_methodDelegates[i] = m_TypeBuilder.DefineNestedType("delegate" + methodInfos[i].Name + "Handler",
                        TypeAttributes.NestedPrivate | TypeAttributes.Sealed,
                        typeof(MulticastDelegate));
                    //在代理里类中创建一个构造函数,构造函数是在执行时管理的
                    m_constructOfmethodDelegates[i]=m_methodDelegates[i].DefineConstructor(MethodAttributes.Public, CallingConventions.Standard,
                        new Type[] {typeof(Object),typeof(IntPtr) });
                    m_constructOfmethodDelegates[i].SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
                    Type[] argsType = GetParameterTypes(methodInfos[i]);
                    //定义Invoke方法
                    m_methodDelegates[i].DefineMethod("Invoke", MethodAttributes.Public, CallingConventions.Standard,
                        methodInfos[i].ReturnType,//返回值
                        argsType//函数参数
                        ).SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
                    //m_methodDelegates[i]
                    m_methodDelegates[i].CreateType();
                }
            }
            /// <summary>
            /// 代理类中加入intercepter变量
            /// </summary>
            FieldBuilder m_intercepter;
            private FieldBuilder[] m_eventDelegateMethods;
            /// <summary>
            ///为每个方法的delegate生成一个变量
            /// 例如:public event delegateChangeNameHandler OnMethodNameEvent;
            /// </summary>
            private void GentrateMethodDelegateEvent()
            {
                //在代理类中添加拦截器的变量
                m_intercepter = m_TypeBuilder.DefineField("_intercepter", typeof(Intercepter), FieldAttributes.Private);
                MethodInfo[] methodInfos = m_Type.GetMethods();
                m_eventDelegateMethods = new FieldBuilder[methodInfos.Length];
                for (int i = 0; i < methodInfos.Length; i++)
                {
                    m_eventDelegateMethods[i] = m_TypeBuilder.DefineField("On"+methodInfos[i].Name, m_methodDelegates[i], FieldAttributes.Private);
                }
            }
            private MethodBuilder[] m_callBackMethods;
            /// <summary>
            /// 定义回调函数
            /// private Type callBack_OnMethodName(Type[])
            /// </summary>
            private void GenerateCallBackMethods()
            {
                MethodInfo[] methodInfos = m_Type.GetMethods();
                m_callBackMethods = new MethodBuilder[methodInfos.Length];
                for (int i = 0; i < methodInfos.Length; i++)
                {
                    Type[] argsTypes = GetParameterTypes(methodInfos[i]);
                    m_callBackMethods[i] =
                        m_TypeBuilder.DefineMethod("callBack_On"+methodInfos[i].Name, MethodAttributes.Private,
                        CallingConventions.Standard, methodInfos[i].ReturnType, argsTypes);
                    //方法体
                    ILGenerator il = m_callBackMethods[i].GetILGenerator();
                    //this压入堆栈
                    il.Emit(OpCodes.Ldarg_0);//this指针
                    //参数压入堆栈
                    for (int j = 0; j < argsTypes.Length; j++)
                    {
                        il.Emit(OpCodes.Ldarg, j + 1);
                    }
                    //调用记录方法
                    il.Emit(OpCodes.Call, methodInfos[i]);
                    //返回
                    il.Emit(OpCodes.Ret);
                }
            }
            
            /// <summary>
            /// 重写父类的方法
            /// </summary>
            private void GentrateOverrideMethods()
            {            
                MethodInfo[] methodInfos = m_Type.GetMethods();
                for (int i = 0; i < methodInfos.Length; i++)
                {
                    Type[] argTypes = GetParameterTypes(methodInfos[i]);
                    MethodBuilder mb = m_TypeBuilder.DefineMethod(methodInfos[i].Name,
                        MethodAttributes.Public | MethodAttributes.Virtual, CallingConventions.Standard,
                        methodInfos[i].ReturnType, argTypes);
                    ILGenerator il = mb.GetILGenerator();
                    //this指针
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldfld, m_intercepter);
                    il.Emit(OpCodes.Ldstr, methodInfos[i].Name);
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldfld, m_eventDelegateMethods[i]);
                    
                    LocalBuilder local = il.DeclareLocal(typeof(Object[]));
                    il.Emit(OpCodes.Ldc_I4, argTypes.Length);
                    il.Emit(OpCodes.Newarr, typeof(Object));
                    il.Emit(OpCodes.Stloc, local);
                    il.Emit(OpCodes.Ldloc, local);
                    for (int j = 0; j < argTypes.Length; j++)
                    {
                        il.Emit(OpCodes.Ldc_I4, j);
                        il.Emit(OpCodes.Ldarg, j + 1);
                        il.Emit(OpCodes.Box, argTypes[j]);
                        il.Emit(OpCodes.Stelem_Ref);
                        il.Emit(OpCodes.Ldloc, local);
                    }
                    il.Emit(OpCodes.Call, typeof(Intercepter).GetMethod("Call", new Type[] { typeof(String), typeof(MulticastDelegate), typeof(Object[]) }));
                    if (methodInfos[i].ReturnType.Equals(typeof(void)))
                    {
                        il.Emit(OpCodes.Pop);
                    }
                    else
                    {
                        il.Emit(OpCodes.Unbox_Any, methodInfos[i].ReturnType);
                    }
                     
                    il.Emit(OpCodes.Ret);
                }
            }
            /// <summary>
            /// 构造函数构造器
            /// </summary>
            private ConstructorBuilder m_constructBuilder;
            /// <summary>
            /// 构建代理类的构造函数
            /// </summary>
            private void GenerateConstructor()
            {
                m_constructBuilder = m_TypeBuilder.DefineConstructor(MethodAttributes.Public,
                    CallingConventions.Standard, new Type[] {typeof(Intercepter)});
                ILGenerator il = m_constructBuilder.GetILGenerator();
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Call, m_Type.GetConstructor(new Type[] { }));
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Stfld, m_intercepter);
                for (int i = 0; i < m_eventDelegateMethods.Length; i++)
                {
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldftn, m_callBackMethods[i]);
                    il.Emit(OpCodes.Newobj, m_constructOfmethodDelegates[i]);
                    il.Emit(OpCodes.Stfld, m_eventDelegateMethods[i]);
                }
                il.Emit(OpCodes.Ret);
            }
            /// <summary>
            /// 返回方法的所有所有参数
            /// </summary>
            /// <param name="methodInfo1"></param>
            /// <returns></returns>
            private Type[] GetParameterTypes(MethodInfo methodInfo1)
            {
                ParameterInfo[] args = methodInfo1.GetParameters();
                Type[] argsType=new Type[args.Length];
                for (int i = 0; i < args.Length; i++)
                {
                    argsType[i] = args[i].ParameterType;
                }
                return argsType;
            }
        }
    }
  • 相关阅读:
    java事件处理(贪吃蛇)
    九九乘法表
    使用文件包含指令include
    jsp页面的基本构成
    软件测试博客

    成功职业女性处世的10大秘诀
    再见啦,冬冬妹
    网摘——杜晓眼眼中的尹珊珊:什么都要,什么都要得到
    网摘——事关“工程师思维”
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/2378816.html
Copyright © 2011-2022 走看看