使用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);

源码地址

https://github.com/Impartsoft/ILLesson

posted @ 2023-06-25 21:45  Iannnnnnnnnnnnn  阅读(14)  评论(0编辑  收藏  举报