zoukankan      html  css  js  c++  java
  • 另类AOP设计

    常见的AOP设计都基于Remoting的RealProxy,或者基于Emit实现的动态代理,或者基于反射的Attribute扫描拦截。但是我们还有另类的拦截方案DynamicObject,只要我们继承DynamicObject,重载几个方法即可,话不多说,上代码。

    public class DynamicProxy<T>:DynamicObject where T:class
    {
          private T _source;
          public DynamicProxy(T source){if(source==null){throw new ArgumentNullException("source");}_source=source;}
          public override bool TryInvokeMember(InvokeMemberBinder binder,object[] args,out      object result)
         {
                 Func<MethodInfo,bool> func=m=>{//filter logic code};
                 var method=_source.GetType().GetMethods().FirstOrDefault(func);
                 if(method!=null&&!method.IsAbstract)
                {
                     //MethodBeginInvokeHander?.Invoke(_source,args);
                     result=method.Invoke(_source,args);
                     //MethodEndInvokeHander?.Invoke(_source,args);
                     return true;
                }
                result=null;
                return false;
         }
    }
    

    Demo:

    public class T
    {
         public string GetName(string name){return name;}
    }
    
    class Program
    {
        static void Main(string[] args)
        {
                Dynamic<T> proxy=new Dynamic<T>(new T());
                proxy.MethodBeginInvokeHandler+=MethodBeginInvoke;
                proxy.MethodEndInvokeHandler+=MethodEndInvoke;
                dynamic d=proxy;
                d.GetName("xxx");
        }
    
        static void MethodBeginInvoke(object sender,MethodEventArgs e)
        {
               Console.WriteLine("Start Invoke:"+e.Name);
        }
        static void MethodEndInvoke(object sender,MethodEventArgs e)
        {
               Console.WriteLine("Result:"+e.Result);
        }
    }
    
  • 相关阅读:
    针对当前用户 对方法加锁
    二叉树
    return与析构续
    return与析构函数
    拷贝构造函数
    引用
    返回引用的函数值和参数的引用
    使用引用返回函数值
    邻接表--图 部分代码
    dec,hex and oct
  • 原文地址:https://www.cnblogs.com/kingge/p/8194024.html
Copyright © 2011-2022 走看看