Я думаю, что более простой способ запуска состоит в том, чтобы просто иметь для него разные методы
public void TriggerActions(Player p)
{
foreach (var buff in p.Buffs.OfType<IBuffOnActionTrigger>()) {
buff.OnPlayerAction(p);
}
}
public void TriggerPlayerDie(Player p)
{
foreach (var buff in p.Buffs.OfType<IBuffOnPlayerDie>()) {
buff.OnPlayerDie(p);
}
}
OfType<T>()
фильтрует баффы, реализующие T, и приводит их к T
, что упрощает вызов соответствующегоmethod.
Обратите внимание, что параметры универсального типа всегда разрешаются во время компиляции, т. е. они не дают динамического поведения во время выполнения.Поэтому void TriggerBuffs<TriggerType>(Player p)
не позволяет вам динамически выбирать триггер.
Если вы хотите сделать это, используйте enum
public enum TriggerType
{
None,
Action,
PlayerDie
}
, теперь вы можете динамически вызывать разные типы триггеров:
public void Trigger(TriggerType triggerType, Player p)
{
switch (triggerType) {
case TriggerType.None:
break;
case TriggerType.Action:
TriggerActions(p);
break;
case TriggerType.PlayerDie:
TriggerPlayerDie(p);
break;
default:
break;
}
}