c#, AOP动态代理实现动态权限控制(一)
因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货。
需求:
- 用户分为管理员、普通用户
- 不同用户拥有不同功能权限
- 用户的权限可配置
- 新增功能时,不用修改权限配置功能
从本篇开始我们使用动态代理完成一个案例,包含动态权限控制的核心功能。
- c# 如何实现动态代理
c#实现动态代理可以使用.net framework 中提供的RealProxy类。
可以看到RealProxy是一个抽象类,其中Invoke是必须要重写的,我们尝试重写下RealProxy。
public class Proxy : RealProxy { public Proxy(Type t) : base(t) { } public override IMessage Invoke(IMessage msg) { throw new NotImplementedException(); } }
现在我们拥有自己的代理类了,我们需要一个“被代理”的对象,于是。
//被代理的类一定要继承自MarshalByRefObject public class Plane : MarshalByRefObject { public void Fly() { Console.WriteLine("fly"); } }
准备工作都做完了,究竟要如何实现代理,我们可以通过RealProxy的GetTransparntProxy()方法来实现。
于是
static void Main(string[] args) { Proxy proxy = new Proxy(typeof(Plane), new Plane()); Plane plane = (Plane)proxy.GetTransparentProxy(); plane.Fly(); }
接下来调试运行,代码执行到fly()方法,在invoke方法抛出异常,可以看出在msg参数中找到我们执行的方法信息与参数。代理模式的原理就是如此,通过代理类的代理方法去执行被代理类的方法。
接下来我们利用msg的参数信息去调用fly()方法。
public class Proxy : RealProxy { public Plane instance = null; public Proxy(Type t, Plane plane) : base(t) { this.instance = plane; } public override IMessage Invoke(IMessage msg) { Console.WriteLine("代理方法"); var methodCall = (IMethodCallMessage)msg; var result = methodCall.MethodBase.Invoke(instance, methodCall.Args); return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall); } }
运行结果
好了,我们可以看到代理方法已经生效了,这也是最最核心的功能。
注:虽然图片来自csdn,但依然是本人在csdn的原创
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?