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


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

Код

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

    ...
}


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

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

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

Автор: ivashkanet 25.8.2006, 09:13
marcusmae, Дуда имеет ввиду такую штуку:
Код

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

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

Автор: marcusmae 30.8.2006, 15:49
Обнаружил несколько более рутинный, но вместе с тем и более органичный способ. Он заключается в переопределении 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);
        }

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