события, которые, как сказал Марк, хранятся в словаре, а не в отдельных полях делегатов.

хотелнаписать функцию многократного использования поднять событие через отражение.

После поиска я нашел этот похожий вопрос:Как мне вызвать событие через отражение в .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, ...: не сработало

Любая помощь приветствуется.

Ответы на вопрос(0)

Ваш ответ на вопрос