【发布时间】:2016-06-06 18:59:38
【问题描述】:
我正在尝试从以下位置重写属性的 get 方法:
get
{
return dataString;
}
到:
get
{
string temp = dataString;
PropertyLogging.Get("DataString", ref temp);
return temp;
}
到目前为止,我尝试了不同的东西:
//the static method I#m trying to insert
var getMethod = att.AttributeType.Resolve().Methods.FirstOrDefault(x => x.Name == _getMethodName);
if (getMethod != null)
{
// ilProcessor.InsertBefore(returnInstruction, ilProcessor.Create(OpCodes.Starg, 1));
ilProcessor.InsertBefore(returnInstruction, ilProcessor.CreateLoadInstruction(property.Name));
// ilProcessor.InsertBefore(returnInstruction, ilProcessor.Create(OpCodes.Ldloc, 0));
ilProcessor.InsertBefore(returnInstruction, ilProcessor.Create(OpCodes.Ldloca_S, 0));
ilProcessor.InsertBefore(returnInstruction, ilProcessor.Create(OpCodes.Call, currentMethod.Module.ImportReference(getMethod)));
}
但它总是以如下代码结尾(用 ilspy 反编译):
get
{
string text = this.dataString;
string arg_17_0 = text;
string text2;
PropertyLogging.Get("DataString", ref text2);
return arg_17_0;
}
我目前拥有的IL代码是:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld UserQuery.dataString
IL_0007: stloc.0 // text
IL_0008: ldloc.0 // text
IL_0009: stloc.1 // arg_17_0
IL_000A: ldnull
IL_000B: stloc.2 // text2
IL_000C: ldstr "DataString"
IL_0011: ldloca.s 02 // text2
IL_0013: call UserQuery+PropertyLogging.Get
IL_0018: nop
IL_0019: ldloc.1 // arg_17_0
IL_001A: stloc.3
IL_001B: br.s IL_001D
IL_001D: ldloc.3
IL_001E: ret
但我需要的是:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld UserQuery.dataString
IL_0007: stloc.0 // temp
IL_0008: ldstr "DataString"
IL_000D: ldloca.s 00 // temp
IL_000F: call UserQuery+PropertyLogging.Get
IL_0014: nop
IL_0015: ldloc.0 // temp
IL_0016: stloc.1
IL_0017: br.s IL_0019
IL_0019: ldloc.1
IL_001A: ret
我也试过在方法体中创建一个新变量,但我不知道如何使用它。
有人知道如何正确重写这个get方法吗?
提前致谢
【问题讨论】:
标签: c# mono cil mono.cecil