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

最新文章

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

热门文章

  1. vs2017发布后宕机,没有响应解决方法
  2. python 设计模式之组合模式Composite Pattern
  3. 001 安装mysql
  4. 廖雪峰Git教程1
  5. Kotlin集合——Set集合
  6. shell编程系列10--文本处理三剑客之sed利用sed查询特定内容
  7. CVAE-GAN论文学习-1
  8. 【php】PHP制作QQ微信支付宝三合一收款码
  9. 压力测试 Apache ab
  10. Python3之内建模块collections