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

你可能感兴趣的:(AOP)