Синтаксис:
Используется csharp
public class EnemyHit
{
public Enemy enemy;
public Hit hit;
public UpdateData(Enemy e, Hit h)
{
enemy = e;
hit = h;
}
}
{
public Enemy enemy;
public Hit hit;
public UpdateData(Enemy e, Hit h)
{
enemy = e;
hit = h;
}
}
То есть если я в одном событии хочу послать и Enemy и Hit, я создаю обертку EnemyHit, помещаю туда данные и потом уже одну единственную обертку передаю как все тот же System.Object: signals.Emit("enemy_hit", enemyHitData), опять же это работает - но дико не удобно.
Что я хочу в идеале: что бы при вызове метода Emit, я указывал произвольную сигнатуру метода и передавал данные соответсвующие сигнатуре, к примеру Emit<Enemy, Hit>("enemy_hit", enemy, hit); Проблема заключается в том что обработчики события(слушатели) это делегаты, что бы слушать события с разными параметрами они сами должны быть разного вида, а если сигнатура делегатов будет различаться то я не могу поместить их в один общий словарь(Dictionary) что бы сделать универсальную систему перебора, поиска и вызова необходимого делегата...
То есть сейчас список слушателей представляет собой Dictionary следующего вида Dictionary<string, List<Action<System.Object>>>, где ключ dictionary это имя события, таким образом когда надо вызвать обработчик события, я по ключу из dictionary получаю список с обработчиками List<Action<System.Object>> пробегаюсь по этому листу и вызываю все action(ы). Однако поскольку тип данных Dictionary необходимо сразу "жестко" указать я не понимаю как сделать что бы он мог содержать списки\List(ы) с разными сигнатурами, то есть что бы в одном словаре для разных событий лежали и List<Action<System.Object>> и List<Action<string, float>>... Возможно это и вовсе нериально, но что-то мне подсказывает что полиморфизм должен с этим помочь... Как вариант нужно ввести какой-то абстрактный, базовый класс, который будет общим для разного вида Action(ов), и этот базовый класс указывать как типа для dictionary, но что-то ничего путного у меня самостоятельно пока не выходит... Если кто знает как решить задачку - буду очень признателен)))
P.S. Извиняюсь за простыню))