【发布时间】:2015-06-05 00:52:51
【问题描述】:
我正在使用 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)
});
对于非泛型类,它就像一个魅力。对于泛型类,它会创建错误的 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
}
字段引用指向开放的泛型类型 [GenericClass] 而不是要构造的类型 [GenericClass
知道如何找到正确的 FieldDefinition 吗?
【问题讨论】:
-
你为什么不只使用反射?
-
什么是
type?它不能是TypeBuilder,因为它没有Fields属性。 -
反射可能没问题,但在我的情况下,我也会用 Cecil 创建字段,所以没有反射。变量类型是 TypeDefinition。
标签: c# generics il mono.cecil