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

时间:2012-12-28 13:07:15

标签: reflection reflection.emit mono.cecil

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

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

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

我遇到过一个复制方法但没有道具,字段等的示例。

1 个答案:

答案 0 :(得分: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);
}

您需要对其进行扩展以传递额外的参数。

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