1. public class DynamicWrapper : DynamicObject
  2. {
  3. private readonly object source;
  4.  
  5. public DynamicWrapper(object source)
  6. {
  7. this.source = source;
  8. }
  9.  
  10. public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
  11. {
  12. var methodInfo = source.GetType().GetMethod(binder.Name);
  13. if (methodInfo != null)
  14. {
  15. Func<object, object[], object> func = (s, a) => methodInfo.Invoke(s, a);
  16.  
  17. result = MethodCall(func, source, args);
  18.  
  19. return true;
  20. }
  21.  
  22. result = null;
  23.  
  24. return false;
  25. }
  26.  
  27. protected virtual object MethodCall(Func<object, object[], object> func, object src, object[] args)
  28. {
  29. return func(src, args);
  30. }
  31. }

  

  1. public class TryCatchDynamicWrapper : DynamicWrapper
  2.  
  3. {
  4.  
  5. public TryCatchDynamicWrapper(object source)
  6.  
  7. : base(source)
  8.  
  9. { }
  10.  
  11. protected override object MethodCall(Func<object, object[], object> func, object src, object[] args)
  12.  
  13. {
  14.  
  15. try
  16.  
  17. {
  18.  
  19. return base.MethodCall(func, src, args);
  20.  
  21. }
  22.  
  23. catch (Exception ex)
  24.  
  25. {
  26.  
  27. Console.WriteLine(ex);
  28.  
  29. throw;
  30.  
  31. }
  32.  
  33. }
  34.  
  35. }

  码是这样的,这里我们增一个扩展方法,这样使我们的代码更加简洁,您会在后面的Unit Test中看到:

  1. 1: public interface ITestObject
  1. 2: {
  1. 3: int Div(int num1, int num2);
  1. 4: }
  1. 5:  
  1. 6: public class TestObject : ITestObject
  1. 7: {
  1. 8:  
  1. 9: #region ITestObject Members
  1. 10:  
  1. 11: public int Div(int num1,int num2)
  1. 12: {
  1. 13: return num1 / num2;
  1. 14: }
  1. 15:  
  1. 16: #endregion
  1. 17:  
  1. 18: public ITestObject WrapDynamicConsoleLogging
  1. 19: {
  1. 20: get
  1. 21: {
  1. 22: return this.WithMethodConsoleLogging();
  1. 23: }
  1. 24: }
  1. 25: }
  1. 26:  
  1. 27: public static class Extenstions
  1. 28: {
  1. 29: public static dynamic WithMethodConsoleLogging(this ITestObject testobject)
  1. 30: {
  1. 31: return new DynamicLoggingWrapper(Activator.CreateInstance<TestObject>(), ConsoleLogger.Instance);
  1. 32: }
  1. 33:  
  1. 34: public static dynamic WrapWith<T>(this ITestObject testobject) where T : DynamicWrapper
  1. 35: {
  1. 36: return Activator.CreateInstance(typeof(T), new object[] { Activator.CreateInstance<TestObject>() });
  1. 37: }
  1. 38: }


Unit Test,如何使用呢:

  1. 1: [Test]
  1. 2: [ExpectedException(typeof(TargetInvocationException))]
  1. 3: public void TestTryCatchDynamicWrapper()
  1. 4: {
  1. 5: dynamic proxy = new TryCatchDynamicWrapper(new TestObject());
  1. 6: var ll = proxy.Div(6, 0);
  1. 7: }
  1. 8:  
  2.  
  3. http://www.cnblogs.com/wintersun/archive/2011/06/19/2084755.html

用.net4中的DynamicObject实现简单AOP的更多相关文章

  1. 菜鸟学习Spring——60s使用annotation实现简单AOP

    一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...

  2. spring注解开发中常用注解以及简单配置

    一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...

  3. 在.NET项目中使用PostSharp,实现AOP面向切面编程处理

    PostSharp是一种Aspect Oriented Programming 面向切面(或面向方面)的组件框架,适用在.NET开发中,本篇主要介绍Postsharp在.NET开发中的相关知识,以及一 ...

  4. JavaEE开发之Spring中的依赖注入与AOP

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  5. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  6. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  7. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

  8. java中Color类的简单总结

    java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...

  9. Linux 中 Vi 编辑器的简单操作

    Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi  filename //打开或新 ...

随机推荐

  1. linux内核的0号进程是在哪里创建的?

    1. 0号进程即为idle进程或swapper进程,也就是空闲进程 2. 0号进程特点 idle是一个进程,其pid为0. 主处理器上的idle由原始进程(pid=0)演变而来.从处理器上的idle由 ...

  2. AndoridSQLite数据库开发基础教程(10)

    AndoridSQLite数据库开发基础教程(10) 添加触发器 触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT.DELETE.UPDATE和UPDATE OF.当数据库系统 ...

  3. 禁止select标签选择,禁止select组件change值

    大家知道, 对于HTML控件select, 是没有readOnly属性的,所以设置它并不起作用,如: 如果用disabled的话,提交时又取不到值. 那有什么方法可以实现?可以有一个折中的方法,如下: ...

  4. shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容

    shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...

  5. hadoop记录-[Flink]Flink三种运行模式安装部署以及实现WordCount(转载)

    [Flink]Flink三种运行模式安装部署以及实现WordCount 前言 Flink三种运行方式:Local.Standalone.On Yarn.成功部署后分别用Scala和Java实现word ...

  6. express获取http参数

    express获取参数有三种方法:官网介绍如下 Checks route params (req.params), ex: /user/:id Checks query string params ( ...

  7. Linux终极shell-zsh的完美配置方案!——oh-my-zsh

    Zsh 介绍 Zsh 兼容 Bash,据传说 99% 的 Bash 操作 和 Zsh 是相同的 Zsh 官网:http://www.zsh.org/ 先看下你的 Linux支持哪些 shell:cat ...

  8. linux系统 重启盘符错乱问题

    linux磁盘重启乱序问题处理 最近到客户那去巡检时,客户提到一个问题,他们的rac在重启的时候,原来的sda1.sdb1.sdc1会对应变成sdd1.sde1.sdf1,由于他们使用的是盘符来绑定裸 ...

  9. gluster设置日志级别

    glusterd --log-level WARNING #将日志级别设定为warning gluster --log-level=ERROR volume status #查看日志级别的状态 glu ...

  10. 什么?Iconfont终于可以支持彩色图标了

    如果你对iconfont有所了解,那你一定对这次iconfont做出的更新产生兴趣.没错,iconfont目前已经升级为iconfont+,并且能够支持大家都很期待的彩色图标. 之前,大家也以文字的形 ...