博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# emit 实现类的代理
阅读量:6568 次
发布时间:2019-06-24

本文共 4845 字,大约阅读时间需要 16 分钟。

using System;using System.Linq;using System.Reflection;using System.Reflection.Emit;namespace EmitCreateDynamicProxy{    class Program    {        static void Main(string[] args)        {            var command = Proxy.Of();            command.Execute();            Console.ReadLine();        }    }    public class Command    {        public virtual void Execute()        {            Console.WriteLine("Hello Kitty!");        }    }     public class Interceptor    {        public object Invoke(object @object, string @method, object[] parameters)        {            Console.WriteLine(              string.Format(" before invoke [{0}]...", @method));            var retObj = @object.GetType().GetMethod(@method).Invoke(@object, parameters);            Console.WriteLine(              string.Format(" after invoke [{0}]...", @method));            return retObj;        }    }    public class Proxy    {        public static T Of
() { string nameOfAssembly = typeof(T).Name + "ProxyAssembly"; string nameOfModule = typeof(T).Name + "ProxyModule"; string nameOfType = typeof(T).Name + "Proxy"; var assemblyName = new AssemblyName(nameOfAssembly); var assembly = AppDomain.CurrentDomain .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); var moduleBuilder = assembly.DefineDynamicModule(nameOfModule); var typeBuilder = moduleBuilder.DefineType( nameOfType, TypeAttributes.Public,typeof(T)); InjectInterceptor
(typeBuilder); var t = typeBuilder.CreateType(); return (T)Activator.CreateInstance(t) ; } private static void InjectInterceptor
(TypeBuilder typeBuilder) { // ---- define fields ---- var fieldInterceptor = typeBuilder.DefineField( "_interceptor", typeof(Interceptor), FieldAttributes.Private); // ---- define costructors ---- var constructorBuilder = typeBuilder.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, null); var ilOfCtor = constructorBuilder.GetILGenerator(); ilOfCtor.Emit(OpCodes.Ldarg_0); ilOfCtor.Emit(OpCodes.Newobj, typeof(Interceptor).GetConstructor(new Type[0])); ilOfCtor.Emit(OpCodes.Stfld, fieldInterceptor); ilOfCtor.Emit(OpCodes.Ret); // ---- define methods ---- var methodsOfType = typeof(T).GetMethods(BindingFlags.Public | BindingFlags.Instance); for (var i = 0; i < methodsOfType.Length; i++) { var method = methodsOfType[i]; var methodParameterTypes = method.GetParameters().Select(p => p.ParameterType).ToArray(); var methodBuilder = typeBuilder.DefineMethod( method.Name, MethodAttributes.Public | MethodAttributes.Virtual, CallingConventions.Standard, method.ReturnType, methodParameterTypes); var ilOfMethod = methodBuilder.GetILGenerator(); ilOfMethod.Emit(OpCodes.Ldarg_0); ilOfMethod.Emit(OpCodes.Ldfld, fieldInterceptor); // create instance of T ilOfMethod.Emit(OpCodes.Newobj, typeof(T).GetConstructor(new Type[0])); ilOfMethod.Emit(OpCodes.Ldstr, method.Name); // build the method parameters if (methodParameterTypes == null) { ilOfMethod.Emit(OpCodes.Ldnull); } else { var parameters = ilOfMethod.DeclareLocal(typeof(object[])); ilOfMethod.Emit(OpCodes.Ldc_I4, methodParameterTypes.Length); ilOfMethod.Emit(OpCodes.Newarr, typeof(object)); ilOfMethod.Emit(OpCodes.Stloc, parameters); for (var j = 0; j < methodParameterTypes.Length; j++) { ilOfMethod.Emit(OpCodes.Ldloc, parameters); ilOfMethod.Emit(OpCodes.Ldc_I4, j); ilOfMethod.Emit(OpCodes.Ldarg, j + 1); ilOfMethod.Emit(OpCodes.Stelem_Ref); } ilOfMethod.Emit(OpCodes.Ldloc, parameters); } // call Invoke() method of Interceptor ilOfMethod.Emit(OpCodes.Callvirt, typeof(Interceptor).GetMethod("Invoke")); // pop the stack if return void if (method.ReturnType == typeof(void)) { ilOfMethod.Emit(OpCodes.Pop); } // complete ilOfMethod.Emit(OpCodes.Ret); } } }}

 

转载地址:http://sspjo.baihongyu.com/

你可能感兴趣的文章
EBB-24、DNS2
查看>>
css3做的nav
查看>>
汇编笔记
查看>>
点击qq、点击邮箱01
查看>>
时间处理总结(三)javascript与WCF
查看>>
Ubantu下安装jdk 教程
查看>>
ActiveMQ入门实例
查看>>
linux安装至少有哪两个分区,各自作用是什么?
查看>>
swoole 安装和简单实用
查看>>
文件系统 第八次迭代 VFS相关说明
查看>>
速读《构建之法:现代软件工程》提问
查看>>
SpringCloud注册中心环境搭建euraka
查看>>
ElasticSearch 安装使用
查看>>
React性能分析利器来了,妈妈再也不用担心我的React应用慢了(转)
查看>>
信息安全管理(1):组织的三个层面
查看>>
原生JS实现圆周运动
查看>>
文件的读写
查看>>
前端面试通关指南
查看>>
制作首页的显示列表。
查看>>
同样加班 不同收获
查看>>