события, которые, как сказал Марк, хранятся в словаре, а не в отдельных полях делегатов.
хотелнаписать функцию многократного использования поднять событие через отражение.
После поиска я нашел этот похожий вопрос:Как мне вызвать событие через отражение в .NET / C #?
Это работает, пока я не зарегистрирую обработчик событий в элементе управления WinForm и не попытаюсь вызвать его. Личное поле<EventName>
'просто исчезает.
Ниже мой упрощенный код, который воспроизводит проблему:
Program.cs:
public static void Main()
{
Control control = new Control();
control.Click += new EventHandler(control_Click);
MethodInfo eventInvoker = ReflectionHelper.GetEventInvoker(control, "Click");
eventInvoker.Invoke(control, new object[] {null, null});
}
static void control_Click(object sender, EventArgs e)
{
Console.WriteLine("Clicked !!!!!!!!!!!");
}
Вот мой класс ReflectionHelper:
public static class ReflectionHelper
{
/// <summary>
/// Gets method that will be invoked the event is raised.
/// </summary>
/// <param name="obj">Object that contains the event.</param>
/// <param name="eventName">Event Name.</param>
/// <returns></returns>
public static MethodInfo GetEventInvoker(object obj, string eventName)
{
// --- Begin parameters checking code -----------------------------
Debug.Assert(obj != null);
Debug.Assert(!string.IsNullOrEmpty(eventName));
// --- End parameters checking code -------------------------------
// prepare current processing type
Type currentType = obj.GetType();
// try to get special event decleration
while (true)
{
FieldInfo fieldInfo = currentType.GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.GetField);
if (fieldInfo == null)
{
if (currentType.BaseType != null)
{
// move deeper
currentType = currentType.BaseType;
continue;
}
Debug.Fail(string.Format("Not found event named {0} in object type {1}", eventName, obj));
return null;
}
// found
return ((MulticastDelegate)fieldInfo.GetValue(obj)).Method;
}
}
Дополнительная информация:
Событие в том же классе: сработало.Событие в другом классе, подкласс в той же сборке: сработало.Событие вМОИ другой режим сборки, отладки и выпуска: работал.Событие в WinForm, DevExpress, ...: не сработалоЛюбая помощь приветствуется.