首页 > 其他分享 >使用DynamicMethod实现抽象方法

使用DynamicMethod实现抽象方法

时间:2023-06-25 21:55:05浏览次数:43  
标签:OpCodes DynamicMethod MethodAttributes 抽象 il var oldMethod 方法 Emit

本文介绍使用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

标签:OpCodes,DynamicMethod,MethodAttributes,抽象,il,var,oldMethod,方法,Emit
From: https://www.cnblogs.com/Iannnnnnnnnnnnn/p/17504054.html

相关文章

  • 抽象基类Callable、Hashable
    抽象基类Callable、Hashable的主要作用是为内置函数isinstance提供支持,以一种安全的方式判断对象能不能调用或散列。 若想检查是否能调用,可以使用内置的callable()函数;但是没有类似的hashable()函数,因此测试对象是否可散列,最好使用isinstance(my_obj,Hashable)。 ......
  • RANSAC方法例子
    RANSAC是一种常用的剔除数据中异常点的方法。本文以拟合圆为例展示RANSAC的工作方式。首先我们有一组点,假设内点的概率是p。我们要使RANSAC的成功率至少达到${\eta=99.9\%}$,那么至少需要重复选择多少次样本?首先确定一个圆需要3个点,即每次选择随机选3个点,因此一次选择包含外点的......
  • 基于三维离散点插值的高度图方法
    在我读研时,导师的项目是做一个无人水质检测船。其目标之一是具备绘制水域的深度图的功能。基本流程是在调查水域时用无人船载着一个深度计记录水域各处的位置和深度${\left(x,y,z\right)}$,然后根据测得的数据用LabView渲染成一个水域深度3D图。因为无人船测量深度数据的位置${......
  • 关于Java中ArrayList类的toArray方法详解
    先上源码:publicObject[]toArray(){returnArrays.copyOf(elementData,size);}可以看到ArrayList类的toArray()方法调用了Arrays.copyOf(elementData,size)(其中的elementData是ArrayList类中用来存储对象的数组,size是数组大小),接下来进入其内部:publicsta......
  • C++ 数据抽象
     数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。数据抽象是一种依赖于接口和实现分离的编程(设计)技术。让我们举一个现实生活中的真实例子,比如一台电视机,您可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD播......
  • Python动态修改实例对象的方法
    代码如下:importtypes#定义一个类classMyClass:deforiginal_method(self):#原始的执行函数print("原始的执行函数")#创建类的实例my_object=MyClass()#定义新的执行函数defnew_function(self):#在这里定义新的执行函数prin......
  • 根据SPN和FMI生成DTC的方法
    做事情,记着抓主要矛盾,不可能面面俱到 =DEC2BIN(MOD(QUOTIENT(A1,256^2),256),8)&DEC2BIN(MOD(QUOTIENT(A1,256^1),256),8)&DEC2BIN(MOD(QUOTIENT(A1,256^0),256),8) 这个函数的意思就是把表格A1里面的数据全部搞成二进制例如A1里面是十进制520702 =DEC2BIN(D43,5) ......
  • 前端封装excel下载方法&&解决前端下载请求设置responseType: 'blob'时后台报错无法处
    请求设置responseType:'blob'时接口报错了如果不做处理则获取不到接口错误信息,此时下载的文件是有问题的。/*@paramsoptions{}*data:Blob,*fileName:String,*successMsg:String,**/import{Message}from'element-ui'importdownloadExcelFilePublicHandler......
  • 【vim】复制黏贴的方法
    1、按字符复制与粘贴在命令行模式下输入字符v(小写),便可以进入按字符选择模式,通过h、j、k、l键移动光标选择要进行复制的字符串。完成选择后按下y键进行复制,将鼠标移动到最后一行,按下p执行粘贴操作就完成了对选择的字符串部分完成了按字符复制与粘贴操作。按下小写v进入visual模......
  • 【pycharm】替换字符串的三种方法
    一、场景  工作中我们可能需要修改一些字符串为同一字符串,此时pycharm的一些替换功能就很好用 二、快捷键1、基于当前文件CTRL+R2、基于全局的替换 CTRL+SHIFT+R  三、替换的三种方法1、基于Cc的字符串 这种最简单,就是简单的替换某个字符串为另一个,可以......