1ml等于多少克,哈哈一笑很倾城是谁,云南公务员局网
因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货。
需求:
从本篇开始我们使用动态代理完成一个案例,包含动态权限控制的核心功能。
c# 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的原创
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
网友评论