Создать отражение делегата - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть настройка шины событий (с использованием Redbus) для обработки событий в моей игре. Я хотел бы иметь атрибут, который автоматически регистрирует функцию в моей шине событий.

Обычно я регистрирую событие как:

public void RegisterEvents()
{
    EVENT_BUS.Subscribe<InitializationEvent>(this.OnInit);
}

public void OnInit(InitializationEvent e)
{
}

но в идеале я бы просто сделал

[EventHandler]
public void OnInit(InitializationEvent e)
{
}

У меня есть код для перебора моих классов и методов, чтобы получить каждый метод с атрибутом EventHandler, но когда я пытаюсь создать делегата для регистрации на моей шине событий, я получаю эту ошибку

ArgumentException: method arguments are incompatible

Вот мой код:

private void SetupEventHandlers()
    {
        foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (var _class in assembly.GetTypes())
            {
                if (!_class.IsClass)
                    continue;

                foreach (var method in _class.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
                {
                    if (!method.IsDefined(typeof(EventHandler), false))
                        continue;

                    if (method.IsStatic)
                    {
                        Debug.LogError("Cannot use EventHandler attribute on static fields");
                        continue;
                    }

                    var parameters = method.GetParameters();
                    var eventType = parameters[0].ParameterType;

                    var a = Activator.CreateInstance(_class);

                    var d = Delegate.CreateDelegate(Expression.GetActionType(method.GetType()), a, method);

                    //do rest of registration stuff
                }
            }
        }
    }

У кого-нибудь есть совет, как заставить это работать?

1 Ответ

0 голосов
/ 04 ноября 2018

Полагаю, что [EventHandler] ссылается на класс EventHandlerAtttribute. Тогда method.IsDefined (typeof (EventHandler), false) также должен быть method.IsDefined (typeof (EventHandlerAtttribute), false).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...