#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ы вставляет компилятор на тех местах где нет кода (например, скобки) для того, что б дебагер мог ставить в этих точках брейкпоинты.
Комментариев нет:
Отправить комментарий