Как мне инициировать событие через EventInfo
От: WareZzhKa  
Дата: 24.07.08 13:06
Оценка:
Как мне инициировать событие из другого класса, используя EventInfo?
public class MyClass
{
    public event EventHandler MyEvent;
    public void Do()
    {
        MyEvent(this, EventArgs.Empty);
    }
}
...
MyClass m = new MyClass();
m.MyEvent += new EventHandler(m_MyEvent);
EventInfo ei = m.GetType().GetEvent("MyEvent"); // Получаю EventInfo
MethodInfo mi = ei.EventHandlerType.GetMethod("Invoke"); // Получаю метод Invoke
mi.Invoke(m, new object[] { m, EventArgs.Empty }); // - вот здесь эксепшн - Object does not match target type.
Re: Как мне инициировать событие через EventInfo
От: Spiceman  
Дата: 24.07.08 14:19
Оценка:
Здравствуйте, WareZzhKa, Вы писали:

WZK>MyClass m = new MyClass();

WZK>m.MyEvent += new EventHandler(m_MyEvent);
WZK>EventInfo ei = m.GetType().GetEvent("MyEvent"); // Получаю EventInfo
WZK>MethodInfo mi = ei.EventHandlerType.GetMethod("Invoke"); // Получаю метод Invoke
WZK>mi.Invoke(m, new object[] { m, EventArgs.Empty }); // — вот здесь эксепшн — Object does not match target type.
WZK>[/c#]

EventHandlerType — тип делегата, ассоциированного с событием.
MethodInfo mi — описание метода Invoke этого делегата.
mi.Invoke ожидает первым параметром экземпляр этого делегата. А вы передаете экземпляр класса MyClass.
Re[2]: Как мне инициировать событие через EventInfo
От: WareZzhKa  
Дата: 24.07.08 14:30
Оценка:
Здравствуйте, Spiceman, Вы писали:
S>EventHandlerType — тип делегата, ассоциированного с событием.
S>MethodInfo mi — описание метода Invoke этого делегата.
S>mi.Invoke ожидает первым параметром экземпляр этого делегата. А вы передаете экземпляр класса MyClass.
Верно. ощибся — первый параметр в Invoke у меня должен быть — m.MyEvent

НО вот и получается главный вопрос — как же мне добраться до этого хендла у класса. Имея EventInfo.
Re[3]: Как мне инициировать событие через EventInfo
От: Spiceman  
Дата: 24.07.08 14:36
Оценка:
Здравствуйте, WareZzhKa, Вы писали:

WZK>Здравствуйте, Spiceman, Вы писали:

S>>EventHandlerType — тип делегата, ассоциированного с событием.
S>>MethodInfo mi — описание метода Invoke этого делегата.
S>>mi.Invoke ожидает первым параметром экземпляр этого делегата. А вы передаете экземпляр класса MyClass.
WZK>Верно. ощибся — первый параметр в Invoke у меня должен быть — m.MyEvent

WZK>НО вот и получается главный вопрос — как же мне добраться до этого хендла у класса. Имея EventInfo.


Я что-то совсем запутался. А чем не устраивает:
m.MyEvent(m, EventArgs.Empty);

?

И еще не проверял, можно ли сделать так:
mi.Invoke(m.MyEvent, new object[] { m, EventArgs.Empty });

?

Но зачем все это?
Re[3]: Как мне инициировать событие через EventInfo
От: WareZzhKa  
Дата: 24.07.08 15:04
Оценка:
все нашел:
объявление событие — по сути добавляет еще внутри класса приватное поле — делегат:
FieldInfo f = m.GetType().GetField("MyEvent", BindingFlags.NonPublic | BindingFlags.Instance);
// а потом вызов события
mi.Invoke(f.GetValue(m), new object[] { this, EventArgs.Empty });
Re[4]: Как мне инициировать событие через EventInfo
От: WareZzhKa  
Дата: 24.07.08 15:07
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Здравствуйте, WareZzhKa, Вы писали:

S>Но зачем все это?
Просто всякие фишки с рефлексией — чтобы например из стороннего класса инициировать событие (у меня ваще свои заморочки в коде: мне нада чтобы базовый класс вызывал все события, а в потомках они были только объявлены)

p.s. спасибо за помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.