zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    消息中间件(MQ)
    java Lambda表达式
    【测试】性能测试及性能测试工具JMeter
    【Mysql】mysql集群方案之读写分离
    linux下mysql开启远程访问权限及防火墙开放3306端口
    MySQL事务提交与回滚
    MySQL索引
    MySQL视图
    MySQL事务
    MySQL参数化有效防止SQL注入
  • 原文地址:https://www.cnblogs.com/Byrd/p/3593330.html
Copyright © 2011-2022 走看看