Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вызов метода из текущего объекта с помощью Emit


Автор: Dark Elf 3.9.2010, 06:05
Добрый день

Имеется 2 метода

Код

        public void PrintMessage(object obj)
        {
            MethodInfo methodInfo = obj.GetType().GetProperty("Message").GetGetMethod();
            Paragraph paragraph = new Paragraph();
            paragraph.Inlines.Add(methodInfo.Invoke(obj, null).ToString());
            //MessageBox.Show(methodInfo.Invoke(obj, null).ToString());
            box.Document.Blocks.Add(paragraph);
        }
        
        private static void RegisterEvent(object targetObject, string eventName, string methodName)
        {
            EventInfo eventInfo = targetObject.GetType().GetEvent(eventName);
            MethodInfo methodInfo = eventInfo.EventHandlerType.GetMethod("Invoke");
            IEnumerable<Type> types = methodInfo.GetParameters().Select(param => param.ParameterType);

            DynamicMethod dynamicMethod = new DynamicMethod(eventInfo.EventHandlerType.Name, null,
                                                            types.ToArray(), typeof (QueryWindow));
            methodInfo = typeof (QueryWindow).GetMethod(methodName, new[] {typeof (object)});

            ILGenerator ilGenerator = dynamicMethod.GetILGenerator(256);
            ilGenerator.Emit(OpCodes.Ldarg_1);
            ilGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            ilGenerator.Emit(OpCodes.Ret);

            dynamicMethod.DefineParameter(1, ParameterAttributes.In, "sender");
            dynamicMethod.DefineParameter(2, ParameterAttributes.In, "e");

            Delegate methodDelegate = dynamicMethod.CreateDelegate(eventInfo.EventHandlerType);
            eventInfo.AddEventHandler(targetObject, methodDelegate);
        }


Если первый метод сделать статическим то данный код работает. Не подскажете ли как изменить второй метод чтобы через Emit вызывать метод текущего объекта?

Автор: Любитель 3.9.2010, 09:52
Что такое инстанс метод? Метод с дополнительным первым параметром - ссылкой на экземпляр объекта. Следовательно достаточно вначале добавить LdArg.0 (не проверял).

Автор: jonie 3.9.2010, 10:48
Вот тут есть порт библиотеки cglib на .NET , советую посмотреть и не велосипедить ... 
http://esper.codehaus.org/nesper/download/download.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)