События довольно просты в C #, но документы MSDN, на мой взгляд, делают их довольно запутанными.Обычно в большинстве документов, которые вы видите, обсуждается создание класса, наследуемого от базового класса EventArgs
, и для этого есть причина .Тем не менее, это не самый простой способ создавать события, и для кого-то, желающего чего-то быстрого и легкого, и с течением времени, использование типа Action
является вашим билетом.
Создание событий и подписка на них
1.Создайте свое мероприятие в своем классе сразу после объявления class
.
public event Action<string,string,string,string>MyEvent;
2.Создайте в вашем классе метод класса обработчика событий.
private void MyEventHandler(string s1,string s2,string s3,string s4)
{
Console.WriteLine("{0} {1} {2} {3}",s1,s2,s3,s4);
}
3.Теперь, когда ваш класс вызывается, скажите ему, чтобы связать событие с вашим новым обработчиком событий.Причина использования оператора +=
состоит в том, что вы добавляете к событию свой конкретный обработчик события.На самом деле вы можете сделать это с несколькими отдельными обработчиками событий, и при возникновении события каждый обработчик событий будет работать в той последовательности, в которой вы их добавили.
class Example
{
public Example() // I'm a C# style class constructor
{
MyEvent += new Action<string,string,string,string>(MyEventHandler);
}
}
4.Теперь, когда вы будете готовы, запустите (или, иначе, вызовите) событие где-нибудь в коде вашего класса, например:
MyEvent("wow","this","is","cool");
Конечный результат, когда вы запустите это, это то, что консоль будет издавать "вау, это круто».И если вы изменили «круто» с датой или последовательностью и запустили этот триггер события несколько раз, вы увидите, что результат получается в последовательности FIFO, как обычно должны происходить события.
В этом примереЯ прошел 4 строки.Но вы можете изменить их на любой приемлемый тип, или использовать более или менее типы, или даже удалить <...>
out и ничего не передавать обработчику событий.
И, опять же, если у вас было несколько пользовательскихобработчики событий и подписав их все на ваше событие с оператором +=
, тогда ваш триггер событий будет вызывать их всех по порядку.
Идентификация вызывающих событий
Но что, если вы хотитеопределить вызывающего на это событие в вашем обработчике событий?Это полезно, если вы хотите обработчик события, который реагирует на условия, основанные на том, кто вызвал / вызвал событие.Есть несколько способов сделать это.Ниже приведены примеры, которые показаны в порядке их быстродействия:
Вариант 1. (Самый быстрый) Если вы уже знаете его, передайте имя в виде буквенной строки обработчику события при его запуске.
Вариант 2. (Довольно быстро) Добавьте это в свой класс и вызовите его из вызывающего метода, а затем передайте эту строку в обработчик событий при его запуске:
private static string GetCaller([System.Runtime.CompilerServices.CallerMemberName] string s = null) => s;
Вариант 3(Наименее быстро, но все еще быстро). В вашем обработчике событий, когда вы его запускаете, получите строку имени вызывающего метода со следующим:
string callingMethod = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().ReflectedType.Name.Split('<', '>')[1];
Отказ от подписки на события
Возможен сценарий, когдаВаше пользовательское событие имеет несколько обработчиков событий, но вы хотите удалить один специальный из списка обработчиков событий.Чтобы сделать это, используйте оператор -=
, например, так:
MyEvent -= MyEventHandler;
Однако, с небольшой осторожностью.Если вы сделаете это, и у этого события больше не будет никаких обработчиков событий, и вы снова вызовете это событие, оно выдаст исключение.(Исключения, конечно, вы можете перехватывать с помощью блоков try / catch.)
Очистка всех событий
Хорошо, допустим, вы закончили с событиями и не хотите их обрабатывать.Больше.Просто установите его в null следующим образом:
MyEvent = null;
То же самое предостережение для событий отписки также здесь.Если в вашем пользовательском обработчике событий больше нет событий, и вы запускаете его снова, ваша программа выдаст исключение.