Использование делегата EventHandler

65
09 декабря 2021, 06:50

Помогите разложить в голове схему использования события, основанного на предоставляемом делегате EventHandler на примере простой задачи(видел похожий вопрос на этом сайте, но там использовался какой-то кастомный делегат и было мало чего понятно).

Допустим, есть класс Doctor, у него есть поле - фамилия и номер кабинета, в котором он принимает, а есть класс Patient, у которого есть поле фамилия и номер палаты, где он лежит.

Задача: при изменении номера кабинета врача оповещать об этом пациента(можно просто текстовым сообщением).

class Doctor
    {
        public event EventHandler ChangedInCabinetNumber = delegate { };
        public string Surname { get; private set; }
        ushort cabinetNumber;
        public ushort CabinetNumber 
        {
            get => cabinetNumber;
            private set
            {
                cabinetNumber = value;
            }
        }
        public Doctor(string surname, ushort cabinetNumber)
        {
            Surname = surname ?? throw new ArgumentNullException(nameof(surname));
            CabinetNumber = cabinetNumber;
        }
    }
class Patient
    {
        public string Surname { get; private set; }
        public ushort CabinetNumber { get; private set; }
        public Patient(string surname, ushort cabinetNumber)
        {
            Surname = surname ?? throw new ArgumentNullException(nameof(surname));
            CabinetNumber = cabinetNumber;
        }
    }
Answer 1

Просто, создайте у Patient обработчик события:

void ChangeCabinetNumber(object o,EventArgs args)
{
    //Что-то сделать
}

и подпишете его на Doctor.ChangedInCabinetNumber:

doc.ChangedInCabinetNumber+=pat.ChangeCabinetNumber;

Это код должен быть в каком-нибудь Main, когда вы создаете объекты докторов и пациентов.

В сеттере свойства Doctor.CabinetNumber дергайте ChangedInCabinetNumber если есть подписчики.

public ushort CabinetNumber 
{
    get => cabinetNumber;
    private set
    {
        cabinetNumber = value;
        ChangedInCabinetNumber?.Invoke(this,new EventArgs())
    }
}
READ ALSO
Как задать curl запрос в С#

Как задать curl запрос в С#

Пример curl-запроса:

181
Как подключить к SQL базе данных в UNITY 3D

Как подключить к SQL базе данных в UNITY 3D

стало интересно, как подключиться к базе данных SQL в Unity 3DЯ нашёл пару статей, что это необходимо делать через php, но так,как навыки в данном...

155
CS0122: is inaccessible due to its protection level

CS0122: is inaccessible due to its protection level

Есть класс и код, взаимодействующий с нимПри сборке возникают ошибки непонятно по какой причине - все модификаторы установлены как public

81