用.net4中的DynamicObject实现简单AOP
2024-08-27 04:00:14
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
最新文章
- win10取消vpn使用远程默认网关
- WebService基本概念及原理
- Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本
- 【BZOJ-1441】Min 裴蜀定理 + 最大公约数
- Excel 的一些用法--行号赋给一列
- Go Mobile 例子 basic 源码分析
- Android核心分析 之九Zygote Service
- shell复习笔记----查找与替换
- MySQL内存表的特性与使用介绍 -- 简明现代魔法
- winXP JDK由1.8改为1.6
- Hadoop-2.6.0安装文档
- 闭包中this指向window的原因
- [Noi2016]网格
- 记MVC学习过程中一次传参到View时遇到的错误
- Yii2 设计模式——设计模式简介
- python unittest框架装饰器
- PHP实现简单发红包(随机分配,平均分配)
- 【Codeforces 115D】Unambiguous Arithmetic Expression
- odoo订餐系统之订单相关知识点理解
- JAVA SpringBoot2 整合 JSP视图模板 整合 Ueditor富文本编辑器