Como posso criar meu próprio evento em C #?

Como posso criar meu próprio evento em C #?

Aqui está um exemplo de criação e uso de um evento com c #

using System; namespace Event_Example { //First we have to define a delegate that acts as a signature for the //function that is ultimately called when the event is triggered. //You will notice that the second parameter is of MyEventArgs type. //This object will contain information about the triggered event. public delegate void MyEventHandler(object source, MyEventArgs e); //This is a class which describes the event to the class that recieves it. //An EventArgs class must always derive from System.EventArgs. public class MyEventArgs : EventArgs { private string EventInfo; public MyEventArgs(string Text) { EventInfo = Text; } public string GetInfo() { return EventInfo; } } //This next class is the one which contains an event and triggers it //once an action is performed. For example, lets trigger this event //once a variable is incremented over a particular value. Notice the //event uses the MyEventHandler delegate to create a signature //for the called function. public class MyClass { public event MyEventHandler OnMaximum; private int i; private int Maximum = 10; public int MyValue { get { return i; } set { if(value <= Maximum) { i = value; } else { //To make sure we only trigger the event if a handler is present //we check the event to make sure it's not null. if(OnMaximum != null) { OnMaximum(this, new MyEventArgs("You've entered " + value.ToString() + ", but the maximum is " + Maximum.ToString())); } } } } } class Program { //This is the actual method that will be assigned to the event handler //within the above class. This is where we perform an action once the //event has been triggered. static void MaximumReached(object source, MyEventArgs e) { Console.WriteLine(e.GetInfo()); } static void Main(string[] args) { //Now lets test the event contained in the above class. MyClass MyObject = new MyClass(); MyObject.OnMaximum += new MyEventHandler(MaximumReached); for(int x = 0; x <= 15; x++) { MyObject.MyValue = x; } Console.ReadLine(); } } } 

Eu tenho uma discussão completa sobre events e delegates no meu artigo de events . Para o tipo mais simples de evento, você pode simplesmente declarar um evento público e o compilador criará um evento e um campo para acompanhar os inscritos:

 public event EventHandler Foo; 

Se você precisa de uma lógica de assinatura / desinscrição mais complicada, você pode fazer isso explicitamente:

 public event EventHandler Foo { add { // Subscription logic here } remove { // Unsubscription logic here } } 

Você pode declarar um evento com o seguinte código:

 public event EventHandler MyOwnEvent; 

Um tipo de delegado personalizado em vez de EventHandler pode ser usado, se necessário.

Você pode encontrar informações detalhadas / tutoriais sobre o uso de events no .NET no artigo Events Tutorial (MSDN).

para fazer isso, precisamos conhecer os três componentes

  1. o lugar responsável por firing the Event
  2. o lugar responsável por responding to the Event
  3. o próprio evento

    uma. Evento

    b .EventArgs

    c. Enumeração EventArgs

agora vamos criar o evento que disparou quando uma function é chamada

mas eu a minha ordem de resolver este problema assim: eu estou usando a class antes de criá-lo

  1. o lugar responsável por responding to the Event

     NetLog.OnMessageFired += delegate(object o, MessageEventArgs args) { // when the Event Happened I want to Update the UI // this is WPF Window (WPF Project) this.Dispatcher.Invoke(() => { LabelFileName.Content = args.ItemUri; LabelOperation.Content = args.Operation; LabelStatus.Content = args.Status; }); }; 

O NetLog é uma class estática que explicarei depois

o próximo passo é

  1. o lugar responsável por firing the Event

     //this is the sender object, MessageEventArgs Is a class I want to create it and Operation and Status are Event enums NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Started)); downloadFile = service.DownloadFile(item.Uri); NetLog.FireMessage(this, new MessageEventArgs("File1.txt", Operation.Download, Status.Finished)); 

o terceiro passo

  1. o próprio evento

Eu warped o evento dentro de uma class chamada NetLog

 public sealed class NetLog { public delegate void MessageEventHandler(object sender, MessageEventArgs args); public static event MessageEventHandler OnMessageFired; public static void FireMessage(Object obj,MessageEventArgs eventArgs) { if (OnMessageFired != null) { OnMessageFired(obj, eventArgs); } } } public class MessageEventArgs : EventArgs { public string ItemUri { get; private set; } public Operation Operation { get; private set; } public Status Status { get; private set; } public MessageEventArgs(string itemUri, Operation operation, Status status) { ItemUri = itemUri; Operation = operation; Status = status; } } public enum Operation { Upload,Download } public enum Status { Started,Finished } 

esta class agora contém the Event EventArgs Enums the Event , EventArgs e EventArgs Enums e the function responsável por triggersr o evento

desculpe por esta longa resposta