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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать событие на Invoke заданного метода, ? 
:(
    Опции темы
marcusmae
Дата 24.8.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Допустим, у нас есть класс с определённым в нём внешним методом :

Код

class A
{
    [...]
    public static extern int Method(double A, double B);

    ...
}


Можно ли в унаследованном от А классе сделать событие, возникающее на Invoke метода Method?

Это сообщение отредактировал(а) marcusmae - 24.8.2006, 19:26


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 24.8.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Если только вызывать Method из другого метода, который в свою очередь генерит некое событие. А чтобы никто не смог добраться извне до метода Method, можно завернуть его во вложенный класс с модификатором private.


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 24.8.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



В том-то и дело, что метод должен быть public, и при его вызове должно возникать событие.
Я немного полазил по System.Reflection.Emit.* и выяснил, что можно динамически изменять тела методов и много ещё чего крутить (в моём случае, наверно, можно было бы тело метода сбросить в новый, а на его месте генерить событие или как-то иначе). В общем, потрясающе. Только примеров использования из MSDN недостаточно, и я подумал, может, кто-то хорошо владеет этим.

Это сообщение отредактировал(а) marcusmae - 24.8.2006, 23:33


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 25.8.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



marcusmae, Дуда имеет ввиду такую штуку:
Код

private static int _method(double A, double B)
{
//реализация метода или как у тебя extern-метод 
};

public static int Method(double A, double B)
{
myEvent.Rise();
return _method(A, B);
};


Это сообщение отредактировал(а) ivashkanet - 25.8.2006, 09:14
PM MAIL WWW ICQ   Вверх
marcusmae
Дата 30.8.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Обнаружил несколько более рутинный, но вместе с тем и более органичный способ. Он заключается в переопределении GetType() и возврате из него класса, унаследованного от Type, в котором событие можно создавать в вызове метода InvokeMember:

Код

        public new object InvokeMember(string name, BindingFlags invokeAttr,
            Binder binder, object target, object[] args, CultureInfo culture)
        {
            // raise invoking event
            if (this.OnInvoke != null) this.OnInvoke(name, args);

            return base.InvokeMember(name, invokeAttr, binder, target, args, 
                culture);
        }


Это сообщение отредактировал(а) marcusmae - 30.8.2006, 15:53


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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