用.net4中的DynamicObject实现简单AOP
- 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的更多相关文章
- 菜鸟学习Spring——60s使用annotation实现简单AOP
一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...
- spring注解开发中常用注解以及简单配置
一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...
- 在.NET项目中使用PostSharp,实现AOP面向切面编程处理
PostSharp是一种Aspect Oriented Programming 面向切面(或面向方面)的组件框架,适用在.NET开发中,本篇主要介绍Postsharp在.NET开发中的相关知识,以及一 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- Deferred在jQuery和Angular中的使用与简单实现
Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...
- java中Color类的简单总结
java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...
- Linux 中 Vi 编辑器的简单操作
Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi filename //打开或新 ...
随机推荐
- linux内核的0号进程是在哪里创建的?
1. 0号进程即为idle进程或swapper进程,也就是空闲进程 2. 0号进程特点 idle是一个进程,其pid为0. 主处理器上的idle由原始进程(pid=0)演变而来.从处理器上的idle由 ...
- AndoridSQLite数据库开发基础教程(10)
AndoridSQLite数据库开发基础教程(10) 添加触发器 触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT.DELETE.UPDATE和UPDATE OF.当数据库系统 ...
- 禁止select标签选择,禁止select组件change值
大家知道, 对于HTML控件select, 是没有readOnly属性的,所以设置它并不起作用,如: 如果用disabled的话,提交时又取不到值. 那有什么方法可以实现?可以有一个折中的方法,如下: ...
- shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容
shell编程系列11--文本处理三剑客之sed利用sed删除文本中的内容 删除命令对照表 命令 含义 1d 删除第一行内容 ,10d 删除1行到10行的内容 ,+5d 删除10行到16行的内容 /p ...
- hadoop记录-[Flink]Flink三种运行模式安装部署以及实现WordCount(转载)
[Flink]Flink三种运行模式安装部署以及实现WordCount 前言 Flink三种运行方式:Local.Standalone.On Yarn.成功部署后分别用Scala和Java实现word ...
- express获取http参数
express获取参数有三种方法:官网介绍如下 Checks route params (req.params), ex: /user/:id Checks query string params ( ...
- Linux终极shell-zsh的完美配置方案!——oh-my-zsh
Zsh 介绍 Zsh 兼容 Bash,据传说 99% 的 Bash 操作 和 Zsh 是相同的 Zsh 官网:http://www.zsh.org/ 先看下你的 Linux支持哪些 shell:cat ...
- linux系统 重启盘符错乱问题
linux磁盘重启乱序问题处理 最近到客户那去巡检时,客户提到一个问题,他们的rac在重启的时候,原来的sda1.sdb1.sdc1会对应变成sdd1.sde1.sdf1,由于他们使用的是盘符来绑定裸 ...
- gluster设置日志级别
glusterd --log-level WARNING #将日志级别设定为warning gluster --log-level=ERROR volume status #查看日志级别的状态 glu ...
- 什么?Iconfont终于可以支持彩色图标了
如果你对iconfont有所了解,那你一定对这次iconfont做出的更新产生兴趣.没错,iconfont目前已经升级为iconfont+,并且能够支持大家都很期待的彩色图标. 之前,大家也以文字的形 ...