使用mono.cecil将新构造函数添加到"existing"类型

use*_*537 2 reflection reflection.emit mono.cecil

我正在尝试将新的重载构造函数添加到现有类型.我尝试使用emit命名空间来完成它,但是创建的类型不会继承基类和所有其他方法.

在阅读了一些文章之后,我决定用.net框架内置类来实现它.

所以我得到了Mono.Cecil,但是找不到任何体面的例子来实现这个目标.

我遇到过一个复制方法的样本,但不是道具,字段等.

Sim*_*mon 7

这会添加一个空构造函数

void AddEmptyConstructor(TypeDefinition type, MethodReference baseEmptyConstructor)
{
    var methodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName;
    var method = new MethodDefinition(".ctor", methodAttributes, ModuleDefinition.TypeSystem.Void);
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Call, baseEmptyConstructor));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
    type.Methods.Add(method);
}
Run Code Online (Sandbox Code Playgroud)

您需要扩展它以传递额外的参数.

从这里https://github.com/Fody/EmptyConstructor/blob/master/Fody/ModuleWeaver.cs