Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

ILGenerator логика для свойства в set

#c_sharp


как на ILGenerator  можно сделать:

public string MyMethod(string s, int i)
{
  return s + "____" + i;
}

private static string _s;
public static string ss
{
   get { return _s; }
   set {
           var x = MyMethod(value, 100);
           _s = x;
       }
}

я делаю так:

var setter = typeBuilder.DefineMethod("set_" + name, getSetAttr, null, new[] {type});
var setIL = setter.GetILGenerator();

setIL.Emit(OpCodes.Nop);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Ldc_I4, 100);
setIL.EmitCall(OpCodes.Call, method, null);
setIL.Emit(OpCodes.Nop);

setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, field);
setIL.Emit(OpCodes.Ret);

но не работает вызов метода MyMethod()....    


Ответы

Ответ 1



для вызова Instance-метода (метода объекта, не статического) необходимо передать первым параметром объект, у которого вызывается метод. Логика вызова метода с 2я параметрами будет такой пуш объекта пуш аргумента 1 пуш аргумента 2 вызов Каждому инстанс методу при вызове 0м параметром передается объект, у которого вызывают этот метод в данном случае код будет таким ldarg.0 ldarg.1 ldc.i4 100 call method PS: nop не нужен (наверное подсмотрел ildasmом). Nopы вставляет компилятор на тех местах где нет кода (например, скобки) для того, что б дебагер мог ставить в этих точках брейкпоинты.

Комментариев нет:

Отправить комментарий