参考链接:

https://pieterderycke.wordpress.com/tag/reflection-emit/

http://www.moon-soft.com/doc/23252.htm

http://www.codeproject.com/Articles/18677/Dynamic-Assemblies-using-Reflection-Emit-Part-II-o

示例一:

  public interface IProxy{void GetProxyInstance();}public static class Util{public static void Before(string message){Console.WriteLine( $"dynamic message: {message}" );}}public class TypeCreator{private readonly Type _targetType;public TypeCreator(Type targetType){this._targetType = targetType;}public Type Build(){var currentAppDomain = AppDomain.CurrentDomain;var assemblyName = new AssemblyName {Name = "_Aop_Assembly_" + this._targetType.Name};var assemblyBuilder = currentAppDomain.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run );var moduleBuilder = assemblyBuilder.DefineDynamicModule( "_Aop_Module_" + this._targetType.Name );var implTypeName = "_Impl_" + this._targetType.Name;var implTypeAttribute = TypeAttributes.Class | TypeAttributes.Public;Type implTypeParent;Type[] implTypeInterfaces;if( this._targetType.IsInterface ){implTypeParent = null;implTypeInterfaces = new[] {this._targetType};}else{implTypeParent = this._targetType;implTypeInterfaces = new Type[0];}var typeBuilder = moduleBuilder.DefineType( implTypeName, implTypeAttribute, implTypeParent, implTypeInterfaces );var implTargetMethods = this._targetType.GetMethods();foreach( var implTargetMethod in implTargetMethods ){if( implTargetMethod.IsVirtual ){var parameters = implTargetMethod.GetParameters();var parameterTypes = new Type[parameters.Length];for( var i = 0; i < parameters.Length; i++ ){parameterTypes[i] = parameters[i].ParameterType;}var methodBuilder = typeBuilder.DefineMethod( implTargetMethod.Name, MethodAttributes.Public | MethodAttributes.Virtual, implTargetMethod.ReturnType, parameterTypes );var ilGen = methodBuilder.GetILGenerator();ilGen.Emit( OpCodes.Ldstr, "Before Execute " + this._targetType.Name + ";" );ilGen.Emit( OpCodes.Call, typeof( Util ).GetMethod( "Before", new Type[] {typeof( string )} ) );ilGen.Emit( OpCodes.Ret );}}return typeBuilder.CreateType();}}// 调用示例:var tc = new TypeCreator( typeof( IProxy ) );var dynamicType = tc.Build();var proxy = (IProxy) Activator.CreateInstance( dynamicType );proxy.GetProxyInstance();

示例二:

  public class ViewModelBase{protected void RaisePropertyChanged( string propertyName ){Console.WriteLine( $"PropertyName: {propertyName}" );}}[AttributeUsage(AttributeTargets.Property)]public class RaisePropertyChangedAttribute : Attribute{}public class SampleViewModel : ViewModelBase{[RaisePropertyChanged]public virtual string SomeProperty { get; set; }}public static class ReflectionEmitViewModelFactory{public static T CreateInstance<T>()where T : ViewModelBase{Type vmType = typeof(T);VerifyViewModelType(vmType);// Create everything required to get a module builderAssemblyName assemblyName = new AssemblyName("SmartViewModelDynamicAssembly");AppDomain domain = AppDomain.CurrentDomain;AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);//AssemblyBuilderAccess.RunAndSave);ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);string dynamicTypeName = Assembly.CreateQualifiedName(vmType.AssemblyQualifiedName, "Smart" + vmType.Name);TypeBuilder typeBuilder = moduleBuilder.DefineType(dynamicTypeName,TypeAttributes.Public | TypeAttributes.Class, vmType);MethodInfo raisePropertyChangedMethod = typeof(ViewModelBase).GetMethod("RaisePropertyChanged",BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null);foreach( PropertyInfo propertyInfo in FindNotifyPropertyChangCandidates<T>() )UpdateProperty(propertyInfo, typeBuilder, raisePropertyChangedMethod);Type dynamicType = typeBuilder.CreateType();return (T)Activator.CreateInstance(dynamicType);}private static void VerifyViewModelType( Type vmType ){if( vmType.IsSealed )throw new InvalidOperationException("The specified view model type is not allowed to be sealed.");}private static IEnumerable<PropertyInfo> FindNotifyPropertyChangCandidates<T>(){return from p in typeof(T).GetProperties()where p.GetSetMethod() != null && p.GetSetMethod().IsVirtual &&p.GetCustomAttributes(typeof(RaisePropertyChangedAttribute), false).Length > 0select p;}private static void UpdateProperty( PropertyInfo propertyInfo, TypeBuilder typeBuilder,MethodInfo raisePropertyChangedMethod ){// Update the setter of the classPropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyInfo.Name,PropertyAttributes.None, propertyInfo.PropertyType, null);// Create set methodMethodBuilder builder = typeBuilder.DefineMethod("set_" + propertyInfo.Name,MethodAttributes.Public | MethodAttributes.Virtual, null, new Type[] { propertyInfo.PropertyType });builder.DefineParameter(1, ParameterAttributes.None, "value");ILGenerator generator = builder.GetILGenerator();// Add IL code for set method
          generator.Emit(OpCodes.Nop);generator.Emit(OpCodes.Ldarg_0);generator.Emit(OpCodes.Ldarg_1);generator.Emit(OpCodes.Call, propertyInfo.GetSetMethod());// Call property changed for object
          generator.Emit(OpCodes.Nop);generator.Emit(OpCodes.Ldarg_0);generator.Emit(OpCodes.Ldstr, propertyInfo.Name);generator.Emit(OpCodes.Callvirt, raisePropertyChangedMethod);generator.Emit(OpCodes.Nop);generator.Emit(OpCodes.Ret);propertyBuilder.SetSetMethod(builder);}}//调用示例:SampleViewModel viewModel = ReflectionEmitViewModelFactory.CreateInstance<SampleViewModel>();viewModel.SomeProperty = "10";

MSIL Emit AOP相关推荐

  1. C#技术内幕 学习笔记

    引用类型是类型安全的指针,它们的内存是分配在堆(保存指针地址)上的. String.数组.类.接口和委托都是引用类型. 强制类型转换与as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个Sys ...

  2. C#基础全接触分类:asp.net技术

    引用类型是类型安全的指针,它们的内存是分配在堆(保存指针地址)上的. String.数组.类.接口和委托都是引用类型. 强制类型转换与as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个Sys ...

  3. 利用Attribute简化Unity框架IOC注入

    在我们的领域驱动设计(DDD)开发中,我们经常需要IOC框架使得我的框架依赖翻转,依赖抽象,避免直接new依赖于我们的具体实现.这些使得我们的框架整个项目结构不变,很方便的改变具体实现,使得项目提供可 ...

  4. 基因数据处理72之GATK安装成功

    1.下载: git clone https://github.com/broadgsa/gatk-protected.git 2.安装: git checkout 3.5 mvn clean pack ...

  5. .Net Core下基于Emit的打造AOP

    之前的基于DispatchProxy的AOP组件,实现了属性注入,但是这个依旧有很多限制 比如不支持构造器注入,继承DispatchProxy的子类必须是公开类 个人有点代码洁癖,不喜欢这种不能控制的 ...

  6. AOP技术研究 再续

    第四部分  .Net平台AOP技术研究 4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企 ...

  7. .Net中的AOP系列之《AOP实现类型》

    本系列的实验环境:VS 2017. 读完本章后,可能仍然不能实现自己的AOP工具,但应该对两种主要类型(PostSharp和Castle DynamicProxy)的AOP工具的运行原理有了基本的理解 ...

  8. 使用PostSharp进行AOP框架设计:一个简单的原型

    AOP已经不是一个什么新名词了,在博客园使用关键字搜索可以查出n多条关于AOP的介绍,这里就不再赘述了. 在Bruce Zhang's Blog里面有很多关于AOP介绍及其在.net下实现研究,总觉得 ...

  9. 颠覆C#王权的“魔比斯环” — 实现AOP框架的终极利器

    本文为原创,如需转载,请注明作者和出处,谢谢! 时间要追溯到2005年.那时正在做硕士论文.题目是"AOP framework for .net".这个AOP框架将使用C#2.0来 ...

最新文章

  1. 13 Java程序员面试宝典视频课程之容器
  2. debian---nano转VIM
  3. sqlmap namespace ibatis 没有生效
  4. linux yum list包数量少,Linux基础知识之YUM包管理工具
  5. 大牛深入浅出讲解c语言do{...}while(0)功能及用法
  6. Jquery tmpl模板中if条件有多个时的写法
  7. 引导界面图标好大_游戏里那些图标和界面,原来是这么设计出来的?
  8. sparksql 保存点_Spark(十二)【SparkSql中数据读取和保存】
  9. HTML form -enctype
  10. iPhone 13及12推动,机构预计苹果今年将销售近2亿部5G iPhone
  11. usb 键盘码表_键盘鼠标对应码表-delphi键值
  12. Java多线程(八)——多线程辅助功能类
  13. python入门神器下载_Python编程神器 v3.7.2 最新免费版
  14. 易语言大漠插件制作脚本教程
  15. excel 某个单元格不是等于空值_EXCEL中IF函数中怎么表达某一个单元格不等于空白则返回值1.4...
  16. cocos2d-x开源游戏引擎,C++开发iphone/android/uphone/win32游戏
  17. tf.data.Dataset介绍1-from_tensor_slices
  18. android 朋友圈图文,Android 微信分享图片(好友和朋友圈)
  19. Everybody wants to love and be loved
  20. 【R语言】ggplot2:初次见面,请多多关照!

热门文章

  1. 联想微型计算机M3500q怎么拆,爆发小宇宙 创新与实用完美结合联想M3500q
  2. 赵小楼《天道》《遥远的救世主》深度解析(25)丁元英怎么看待韩楚风的正天集团总裁一事(不神之神谓之神)
  3. 计算机维修初级培训课程表,初级维修电工培训班课程表.doc
  4. 每天一条Linux命令(23) host (域名查询工具)
  5. 降低老年人跌倒机率 美国公司砸520万美元运用AI
  6. DRF必备知识(1)
  7. 技术分享 | App测试时常用的adb命令你都掌握了哪些呢?
  8. Mac使用Homebrew安装MySQL
  9. html2canvas 报错:Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement : Tainted canvases may not be ...
  10. 使用g2o进行图优化