У меня есть настройка шины событий (с использованием 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
}
}
}
}
У кого-нибудь есть совет, как заставить это работать?