常見的AOP設計都基於Remoting的RealProxy,或者基於Emit實現的動態代理,或者基於反射的Attribute掃描攔截。但是我們還有另類的攔截方案DynamicObject,只要我們繼承DynamicObject,重載幾個方法即可,話不多說,上代碼。 Demo: ...
常見的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); } }