Обрабатывать все вложенные события в одном месте в c #, используя делегат / событие? - PullRequest
0 голосов
/ 02 апреля 2019

Давайте предположим, что у нас есть MissionA, MissionB и мы хотим трансляцию, когда начнется любая миссия.Как мне добиться этого в c #?

Примерно так (они разные в разных файлах .cs):

Общее задание (в MissionGeneral.cs):

namespace MissionGeneral
{
    public class MissionGeneral
    {
        public delegate void MissionStartedEvent(string name);
        public event MissionStartedEvent OnMissionStart;
    }
}

Под миссию A (в MissionA.cs):

namespace MissionA
{
    public class MissionA
    {
        public delegate void MissionStartedEvent(string name);
        public event MissionStartedEvent OnMissionStart;
        protected virtual void HandleMissionStartedEvent()
        {
            OnMissionStart?.Invoke("MissionA");
        }
    }
}

Под миссию B (в MissionB.cs):

namespace MissionB
{
    public class MissionB
    {
        public delegate void MissionStartedEvent(string name);
        public event MissionStartedEvent OnMissionStart;
        protected virtual void HandleMissionStartedEvent()
        {
            OnMissionStart?.Invoke("MissionB");
        }
    }
}

Broadcaster (в Broadcaster.cs):

using MissionGeneral;    

namespace Broadcaster
{
    public class Broadcaster
    {
        public MissionGeneral mission = new MissionGeneral();

        public Broadcaster()
        {
            mission.OnMissionStart += (_name) =>
            {
                Console.WriteLine($"This is {_name}");
                if (_name == "MissionA") Console.WriteLine("Additional MissionA info");
                else if (_name == "MissionB") Console.WriteLine("Additional MissionB info");
            };
        }
    }
}

1 Ответ

0 голосов
/ 02 апреля 2019

Способ сделать это:

  1. Передать обработчику события объект, вызвавший событие:

    public delegate void MissionStartedEvent(MissionGeneral sender);
    public event MissionStartedEvent OnMissionStart;
    
  2. Пусть сам объект предоставляет необходимую информацию обработчику:

    public Broadcaster()
    {
        mission.OnMissionStart += (sender) =>
        {
            Console.WriteLine($"This is {sender.Name}");
            Console.WriteLine($"Additional info: {sender.AdditionalInfo}");
        };
    }
    

Если каждый подтип MissionGeneral должен иметь конкретную реализацию Name, AdditionalInfo или что-то еще, тогда сделайте эти методы virtual в базовом классе и переопределите их при необходимости.

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

 mission.OnMissionStart += (sender) =>
 {
     Console.WriteLine($"This is {sender.Name}");

     switch (sender) {
         case MissionA a:
             Console.WriteLine(a.SomeSpecificMissionAMember);
             break;
         case MissionB b:
             Console.WriteLine(b.SomeSpecificMissionAMember);
             break; }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...