• C# AOP实现


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.Remoting.Proxies;
    
    namespace Aop
    {
        public class AopAttribute : ProxyAttribute
        {
            public override MarshalByRefObject CreateInstance(Type serverType)
            {
                AopProxy realProxy = new AopProxy(serverType);
                return realProxy.GetTransparentProxy() as MarshalByRefObject;
            }       
    
    
        }
    }
    

     AopProxy.cs

        using System;  
        using System.Collections.Generic;  
        using System.Text;  
        using System.Reflection.Emit;  
        using System.Runtime.Remoting.Proxies;  
        using System.Runtime.Remoting.Messaging;  
        using System.Runtime.Remoting.Activation;  
        using System.Windows.Forms;  
          
        namespace Aop  
        {  
            public class AopProxy : RealProxy  
            {  
                public AopProxy(Type serverType)  
                    : base(serverType) { }  
          
                public override IMessage Invoke(IMessage msg)  
                {  
                    if (msg is IConstructionCallMessage)  
                    {  
                        IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage;  
                        IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg);  
                        RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue);  
                        Console.WriteLine("Call constructor");
                        return constructionReturnMessage;  
                    }  
                    else  
                    {  
                        IMethodCallMessage callMsg = msg as IMethodCallMessage;  
                        IMessage message;  
                        try  
                        {  
                            object[] args = callMsg.Args;  
                            object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args);  
                            message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg);  
                        }  
                        catch (Exception e)  
                        {  
                            message = new ReturnMessage(e, callMsg);  
                        }  
                        Console.WriteLine(message.Properties["__Return"].ToString());
                        return message;  
                    }  
                }  
            }  
        }  
    

     AopAttribute.cs

        using System;  
        using System.Collections.Generic;  
        using System.Text;  
          
        namespace Aop  
        {  
            [AopAttribute]  
            public class AopClass : ContextBoundObject  
            {  
                public string Hello()  
                {  
                    return "welcome";  
                }  
          
            }  
        }  
    

     AopClass.cs

  • 相关阅读:
    申诉电信ADSL宽带限速
    回帖整理
    继续无题
    抛砖引玉,征集体会
    关于程序组织和组织技巧的学习
    周鸿祎行
    无题
    用此书为例讨论下软件思想的学习
    笔记
    方法论究竟为社区提供了什么
  • 原文地址:https://www.cnblogs.com/Byrd/p/3593330.html
Copyright © 2020-2023  润新知