public class DynamicWrapper : DynamicObject
{
private readonly object source; public DynamicWrapper(object source)
{
this.source = source;
} public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var methodInfo = source.GetType().GetMethod(binder.Name);
if (methodInfo != null)
{
Func<object, object[], object> func = (s, a) => methodInfo.Invoke(s, a); result = MethodCall(func, source, args); return true;
} result = null; return false;
} protected virtual object MethodCall(Func<object, object[], object> func, object src, object[] args)
{
return func(src, args);
}
}

  

  public class TryCatchDynamicWrapper : DynamicWrapper

    {

        public TryCatchDynamicWrapper(object source)

            : base(source)

        { }

        protected override object MethodCall(Func<object, object[], object> func, object src, object[] args)

        {

            try

            {

                return base.MethodCall(func, src, args);

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex);

                throw;

            }

        }

    }

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

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


Unit Test,如何使用呢:

   1:          [Test]
   2:          [ExpectedException(typeof(TargetInvocationException))]
   3:          public void TestTryCatchDynamicWrapper()
   4:          {
   5:              dynamic proxy = new TryCatchDynamicWrapper(new TestObject());
   6:              var ll = proxy.Div(6, 0);
   7:          }
   8:   

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. flutter -------- 页面跳转和传值

    在安卓原生开发中,页面跳转可以用Intent类来具体实现: Intent intent =new Intent(MainActivity.this,second.class); startActivi ...

  2. vue---lodash的使用

    Lodash就是这样的一套工具库,它内部封装了诸多对字符串.数组.对象等常见数据类型的处理函数,其中部分是目前ECMAScript尚未制订的规范,但同时被业界所认可的辅助函数.莫倩每天使用npm安装L ...

  3. flutter 的Animation简单了解

    import 'package:flutter/material.dart'; class AnimationDemo extends StatelessWidget { @override Widg ...

  4. Python3基础 complex 声明复数

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  5. pytorch怎么使用定义好的模型的一部分

    Encoder代码为: .输入图片的通道nc=.ndf=. def __init__(self,isize,nz,nc,ndf,ngpu,n_exter_layers=,add_final_conv= ...

  6. k8s记录-dockerfile

    FROM 代表基于哪个镜像 RUN 安装软件使用 MAINTAINER 镜像的创建者 CMD 容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD EN ...

  7. response.getWriter().write的用法

    /** * 获取手机验证码的方法 */ var loopObjBindMobil = null; var secondsBindMobil = 0; function hqBindYzm(moblie ...

  8. 【docker 镜像源】解决quay.io和gcr.io国内无法访问的问题

    该问题容易导致image pull back off 错误,应当换源: 微软: https://yeasy.gitbooks.io/docker_practice/install/mirror.htm ...

  9. JQuery 自定义属性取值 赋值

    <span id="status_68" data-id="0" onclick="collection(68,false);" cl ...

  10. 【linux学习笔记三】链接命令

    链接命令:ln link =============华丽的分割线============= ln又有软链接和硬链接 //硬链接特征(不建议创建硬链接) 1.拥有相同的i节点和存储block块,可以看做 ...