web-dev-qa-db-fra.com

Comment puis-je créer mon propre événement en C #?

Comment puis-je créer mon propre événement en C #?

115
Gold

Voici un exemple de création et d'utilisation d'un événement avec 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();
        }
    }
}
210
Gary Willoughby

J'ai une discussion complète sur les événements et les délégués dans mon article sur les événements . Pour le type d'événement le plus simple, vous pouvez simplement déclarer un événement public et le compilateur créera à la fois un événement et un champ pour suivre les abonnés:

public event EventHandler Foo;

Si vous avez besoin d'une logique plus complexe d'abonnement/désabonnement, vous pouvez le faire explicitement:

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

Vous pouvez déclarer un événement avec le code suivant:

public event EventHandler MyOwnEvent;

Un type de délégué personnalisé au lieu de EventHandler peut être utilisé si nécessaire.

Vous pouvez trouver des informations détaillées/tutoriels sur l'utilisation des événements dans .NET dans l'article Tutoriel sur les événements (MSDN).

20
Brann

pour le faire, nous devons connaître les trois composants

  1. le lieu responsable de firing the Event
  2. le lieu responsable de responding to the Event
  3. l'événement lui-même

    une. un événement

    b .EventArgs

    c. Énumération EventArgs

permet maintenant de créer l'événement qui s'est déclenché quand une fonction est appelée

mais je mon ordre de résoudre ce problème comme ceci: J'utilise la classe avant de le créer

  1. le lieu responsable de 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;
            });
    };
    

NetLog est une classe statique, je l'expliquerai plus tard

la prochaine étape est

  1. le lieu responsable de 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));
    

la troisième étape

  1. l'événement lui-même

J'ai faussé l'événement dans une classe appelée 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
}

cette classe contient maintenant the Event, EventArgs et EventArgs Enums et the function responsable du licenciement

désolé pour cette longue réponse

4
Basheer AL-MOMANI