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