我正在使用Mono.Cecil來重寫某些程序集。例如給定一個帶有字符串字段的泛型類。我想要將代碼生成到寫入此字段的此類的方法中。 這是代碼實現的是:如何將值存儲到泛型類字段(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 < T>]。 我也嘗試過使用相同結果的靜態字段。
任何想法如何才能到達正確的FieldDefinition?
爲什麼你不只是使用反射? – Servy 2015-03-31 15:47:12
什麼是'type'?它不能是'TypeBuilder',因爲它沒有'Fields'屬性。 – svick 2015-03-31 17:14:06
反射可以很好,但在我的情況下,我也會創建與塞西爾領域,所以沒有反思。變量類型是一個TypeDefinition。 – csnemes 2015-03-31 17:44:12