Как мне инициировать событие из другого класса, используя 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.
Здравствуйте, 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
Здравствуйте, Spiceman, Вы писали: S>EventHandlerType — тип делегата, ассоциированного с событием. S>MethodInfo mi — описание метода Invoke этого делегата. S>mi.Invoke ожидает первым параметром экземпляр этого делегата. А вы передаете экземпляр класса MyClass.
Верно. ощибся — первый параметр в Invoke у меня должен быть — m.MyEvent
НО вот и получается главный вопрос — как же мне добраться до этого хендла у класса. Имея EventInfo.
Re[3]: Как мне инициировать событие через EventInfo
Здравствуйте, 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
все нашел:
объявление событие — по сути добавляет еще внутри класса приватное поле — делегат:
FieldInfo f = m.GetType().GetField("MyEvent", BindingFlags.NonPublic | BindingFlags.Instance);
// а потом вызов события
mi.Invoke(f.GetValue(m), new object[] { this, EventArgs.Empty });
Re[4]: Как мне инициировать событие через EventInfo
Здравствуйте, Spiceman, Вы писали:
S>Здравствуйте, WareZzhKa, Вы писали: S>Но зачем все это?
Просто всякие фишки с рефлексией — чтобы например из стороннего класса инициировать событие (у меня ваще свои заморочки в коде: мне нада чтобы базовый класс вызывал все события, а в потомках они были только объявлены)