Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода из текущего объекта с помощью Emit 
:(
    Опции темы
Dark Elf
  Дата 3.9.2010, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: нет
Всего: 10



Добрый день

Имеется 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 вызывать метод текущего объекта?


--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Любитель
Дата 3.9.2010, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



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


--------------------
PM MAIL ICQ Skype   Вверх
jonie
Дата 3.9.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.