使用DynamicMethod实现抽象方法
本文介绍使用DynamicMethod实现抽象方法
1. 创建抽象类与抽象方法
特别注意抽象类不要被其他类所包含,否则IL编译会出错
public abstract class HelloWrold
{
public abstract void SayHelloWorld();
}
2.定义子类
var parentType = typeof(HelloWrold);
var newClass = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("ILTest.Dynamic"), AssemblyBuilderAccess.Run).DefineDynamicModule("TestDynamicModule").DefineType("SubILTest"
, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Sealed, parentType);
3.定义重写方法
var oldMethod = parentType.GetMethod(nameof(HelloWrold.SayHelloWorld));
var newMethod = newClass.DefineMethod(oldMethod.Name, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final, oldMethod.ReturnType
, oldMethod.GetParameters().Select(v => v.ParameterType).ToArray());
4.编写DynamicMethod方法的IL代码
var il = newMethod.GetILGenerator();
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldstr, "HelloWorld");
il.Emit(OpCodes.Call, typeof(Console).GetMethod(nameof(Console.WriteLine), new Type[1] { typeof(string) }));
il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ret);
5.最后定义重写关系
newClass.DefineMethodOverride(newMethod, oldMethod);
源码地址
欢迎大家批评指正,共同学习,共同进步!
作者:Iannnnnnnnnnnnn
出处:https://www.cnblogs.com/Iannnnnnnnnnnnn
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Iannnnnnnnnnnnn
出处:https://www.cnblogs.com/Iannnnnnnnnnnnn
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。