常见的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);
}
}

另类AOP设计的更多相关文章

  1. AOP设计思想_开发流程

    程序员一直在努力做一件事请,写更少的代码,做更多的事情,提高开发效率 在一个开发团队里面,一个人最多只做一件事情,绝对不会说,刚接手做了没多久的任务,上头又交给你另一项任务,绝对不会有的 下面,梦逸来 ...

  2. aop设计原理

    本文摘自 博文--<Spring设计思想>AOP设计基本原理 0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢 ...

  3. aop设计原理(转)

    本文摘自 博文--<Spring设计思想>AOP设计基本原理 0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢 ...

  4. 《Spring设计思想》AOP设计基本原理

    0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Sp ...

  5. Spring AOP设计

    Spring IOC设计到的设计模式: 工厂模式,模板方法模式,单例模式 Spring AOP涉及到的设计模式: 工厂模式,代理模式 1.Spring AOP目标 将分散在程序各处的横切关注点剥离出来 ...

  6. AOP设计场景

    AOP就是切面编程的一个思想,当然完毕一项编码任务,发现有些东西是反复工作,这时就能够考虑使用AOP编程.把一些共性的东西交给它来完毕,我们仅仅关心业务逻辑的东西,最精彩用的场景有两种: 一,控制数据 ...

  7. spring Aop设计原理

    转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...

  8. APP设计资源

    在开发独立客户端时,需要一些不同尺寸的图标和图片,统计如下. APP 图标 ICON iOS:(主要需要这三类图标) 58x58 87x87 (Spotlight & Settings) 80 ...

  9. Spring AOP: Spring之面向方面编程

    Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...

随机推荐

  1. mongo中常用的增删改查

    db.students.find();//按性别分组,并显示每组的姓名db.students.aggregate({ $group:{ _id:'$sex', name:{$push:'$name'} ...

  2. 读C#图解教程的笔记

    第一章记录: 格式化字符串 Console.WriteLine("{0:D}", 123456789);//表示十进制字符串 Console.WriteLine("{0: ...

  3. 透析SOA、RPC、SOAP、REST、ICE、ESB模型发展史

    最初的程序全是单机程序,没有网络,没有RPC,更没有RESTful.程序猿写的东西孤独运行在单机上. 那时的程序猿们语言相通,参与开发同一套系统的团队可以面对面沟通. 网络出现了.网络,也带来变乱.网 ...

  4. 从Redis到Codis移植实践

    一.    背景 随着业务的发展,线上Redis的数据越来越多,所以必须考虑扩容的事情了.对于redis的扩容,目前可选的方案有三种:1.client自己做sharding,一般是按key的hash值 ...

  5. ubuntu14.04安装opencv3.1

    1.下载opencv3.1源码http://opencv.org/releases.html 2.安装opencv3 2.1安装opencv3的依赖 sudo apt-get install buil ...

  6. 【转】Powershell与jenkins集成部署的运用(powershell运用)

    powershell简介: 远程管理采用的一种新的通信协议,Web Services for Management,简称WS-MAN它通过http或者https进行工作,WS-WAN的实现主要基于一个 ...

  7. Machine Learning 第一二周

    # ML week 1 2 一.关于machine learning的名词 学习 从无数数据提供的E:experience中找到一个函数使得得到T:task后能够得到P:prediction 监督学习 ...

  8. webpack4 坑收集:html-webpack-plugin在多页面时,无法将optimization.splitChunks提取的公共块,打包到页面中

    问题描述:  有2个页面index.html和product.html,用html-webpack-plugin和optimization.splitChunks的基本配置如下 { template: ...

  9. mysql数据库优化之索引的维护和优化

    这里是一个工具,即pt-duplicate-key-checker工具 用来检查重复及冗余的索引 用法如下:pt-duplicate-key-checker  -uroot  -p密码  -h127. ...

  10. 【Django模板进阶007】

    本节主要讲 Django模板中的循环,条件判断,常用的标签,过滤器的使用 列表,字典,类的实例的使用 循环:迭代显示列表,字典等中的内容 条件判断:判断是否显示该内容,比如判断是手机访问,还是电脑访问 ...