• 用.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
  • 相关阅读:
    时间戳 时间 相互转换
    CS Academy Remove Update
    一周水题集锦 2017 9.4
    计蒜客 16877 卡牌游戏
    计蒜客 16876 韩梅梅的抽象画
    九度OJ 题目1534:数组中第K小的数字
    CS Academy Switch the Lights
    CF AIM Tech Round 4 C. Sorting by Subsequences
    CF Round 430 C. Ilya And The Tree
    CS Academy Round 44 Check DFS
  • 原文地址:https://www.cnblogs.com/xiangxiong/p/6806958.html
Copyright © 2020-2023  润新知