我正在使用Mono.Cecil来重写一些程序集.给定一个带有字符串字段的泛型类.我想在这个类的方法中生成代码,该类写入该字段.这是实现这一目标的代码:
var origInstanceField = type.Fields.First(fld => fld.Name.Equals("_original"));
InsertBeforeReturn(instanceMethod.Body, new[]
{
Instruction.Create(OpCodes.Ldarg_0),
Instruction.Create(OpCodes.Ldstr, "genCodeToOriginal"),
Instruction.Create(OpCodes.Stfld, origInstanceField)
});
Run Code Online (Sandbox Code Playgroud)
对于非泛型类,它就像一个魅力.对于泛型类,它会产生错误的IL.如果您查看反编译的IL,您可以发现与编译器发出的相同指令相比的差异.
.method public hidebysig instance void FillFields() cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldarg.0
L_0002: ldstr "non-gen code to non-gen field"
L_0007: stfld string TestConsole.GenericClass`1<!T>::_original
L_0017: ldarg.0
L_0018: ldstr "genCodeToOriginal"
L_001d: stfld string TestConsole.GenericClass`1::_original
L_0022: ret
}
Run Code Online (Sandbox Code Playgroud)
字段引用指向开放泛型类型[GenericClass <>],而不是指向要构造的类型[GenericClass <T>].我也尝试使用具有相同结果的静态字段.
任何想法我怎样才能找到正确的FieldDefinition?