C# AOP实现
2024-09-29 18:56:23
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
最新文章
- 28-React state提升、组件组合或继承
- [转]windows 短文件名/短路径名规则
- js除法四舍五入保留小数点后两位写法
- Aspose.word总结
- Android开发之ContentProvider(内容提供者)
- 静态代理VS动态代理
- bzoj1863
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
- poj2409 Let it Bead
- android屏蔽home键的实现
- BNU OJ 50998 BQG's Messy Code
- Python[小甲鱼006常用操作符]
- C++如何返回不定长数组
- 二 Array 数组常用操作方法
- Linux extmail的邮件服务器搭建
- fmt.Sprintf格式化使用
- SQL Server 怎么在分页获取数据的同时获取到总记录数
- WinDbg 之 SOS扩展命令
- 一个nginx服务器配置多站点
- CQ3