• 用.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
  • 相关阅读:
    【Hadoop 分布式部署 五:分布式部署之分发、基本测试及监控】
    【Hadoop 分布式部署 四:配置Hadoop 2.x 中主节点(NN和RM)到从节点的SSH无密码登录】
    【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】
    【Hadoop 分布式部署 二:分布式环境预备工作(主机名 IP地址等设置)】
    【Hadoop 分布式部署 一 :分布式部署准备虚拟机 】
    Java基础 【类之间的关系】
    Java基础 【自动装箱和拆箱、面试题】
    java算法 第七届 蓝桥杯B组(题+答案) 3.凑算式
    java算法 第七届 蓝桥杯B组(题+答案) 2.生日蜡烛
    java算法 第七届 蓝桥杯B组(题+答案) 1.煤球数目
  • 原文地址:https://www.cnblogs.com/xiangxiong/p/6806958.html
Copyright © 2020-2023  润新知