Публикация событий, соответствующих рекомендациям .NET Framework



В следующей процедуре демонстрируется, как добавлять события, соответствующие стандартному шаблону .NET Framework для пользовательских классов и структур. Все события в библиотеке классов .NET Framework основаны на делегате EventHandler, заданном следующим образом:

public delegate void EventHandler(object sender, EventArgs e);
Примечание.
.NET Framework 2.0 представляет общую версию данного делегата EventHandler<(Of <(TEventArgs>)>). В следующих примерах показано, как использовать обе версии.

Хотя события в задаваемых классах могут быть основаны на действительном типе делегата, даже на делегатах, возвращающих значение, обычно рекомендуется основывать события на шаблоне .NET Framework, используя EventHandler, как показано в следующем примере.

 


To publish events based on the EventHandler pattern

1. (Skip this step and go to Step 3a if you do not have to send custom data with your event.) Declare your class at a scope visible to both your publisher and subscriber classes, and add the required members to hold your custom event data. In this example, a simple string is returned.

public class CustomEventArgs: EventArgs { public CustomEventArgs(string s) {    msg = s; } private string msg; public string Message {    get { return msg; } } }

2. (Skip this step if you are using the generic version of EventHandler<(Of <(TEventArgs>)>) .) Declare a delegate in your publishing class. Give it a name that ends with EventHandler. The second parameter specifies your custom EventArgs type.

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

3. Declare the event in your publishing class by using one of the following steps.

a. If you have no custom EventArgs class, your Event type will be the non-generic EventHandler delegate. You do not have to declare it because it is already declared in the System namespace which is included when you create your C# project:

public event EventHandler RaiseCustomEvent;

b. If you are using the non-generic version of EventHandler and you have a custom class derived from EventArgs, declare your event inside your publishing class and use your delegate as the type:

class Publisher { public event CustomEventHandler RaiseCustomEvent; }

c. If you are using the generic version, you do not need a custom delegate. Instead, you specify your event type as EventHandler<CustomEventArgs>, substituting the name of your own class between the angle brackets.

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

Порядок публикации событий, основанных на шаблоне EventHandler

1. (Пропустите этот шаг и перейдите к шагу 3a, если не требуется передавать с событием пользовательские данные.) Объявите свой класс в области, видимой для ваших классов издателя и подписчика, и добавьте необходимые члены для хранения данных о настраиваемых событиях. В данном примере возвращается простая строка.

ß---

2. (Пропустите данный шаг, если используется универсальная (generic) версия EventHandler<(Of <<TEventArgs>)>>.) Объявите делегат в своем классе публикации. Назначьте ему имя, заканчивающееся на EventHandler. Второй параметр задает ваш тип EventArgs.

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

3. Объявите событие в своем классе публикации с помощью одного из следующих действий.

a. Если пользовательский класс EventArgs отсутствует, ваш тип события будет иметь стандартный тип делегата EventHandler. Его не нужно объявлять, так как он уже объявлен в пространстве имен System, добавленном при создании проекта C#:

public event EventHandler RaiseCustomEvent;

b. Если используется версия EventHandler, не являющаяся универсальной, и имеется пользовательский класс, производный от EventArgs, объявите свое событие внутри класса публикации и используйте свой делегат как тип:

class Publisher { public event CustomEventHandler RaiseCustomEvent; }

c. Если используется универсальная версия, то пользовательский делегат не требуется. Вместо этого необходимо задать тип события как EventHandler<CustomEventArgs>, заключив название своего класса в угловые скобки.

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

 


Example

The following example demonstrates the previous steps given by using a custom EventArgs class and EventHandler<(Of <(TEventArgs>)>) as the event type.

namespace DotNetEvents { using System; using System.Collections.Generic; // Define a class to hold custom event info public class CustomEventArgs : EventArgs {    public CustomEventArgs(string s)    {        message = s;    }    private string message;    public string Message    {        get { return message; }        set { message = value; }    } } // Class that publishes an event class Publisher {    // Declare the event using EventHandler<T>    public event EventHandler<CustomEventArgs> RaiseCustomEvent;    public void DoSomething()    {        // Write some code that does something useful here        // then raise the event. You can also raise an event        // before you execute a block of code.        OnRaiseCustomEvent(new CustomEventArgs("Did something"));    }    // Wrap event invocations inside a protected virtual method    // to allow derived classes to override the event invocation behavior    protected virtual void OnRaiseCustomEvent(CustomEventArgs e)    {        // Make a temporary copy of the event to avoid possibility of        // a race condition if the last subscriber unsubscribes        // immediately after the null check and before the event is raised.        EventHandler<CustomEventArgs> handler = RaiseCustomEvent;        // Event will be null if there are no subscribers        if (handler != null)           {            // Format the string to send inside the CustomEventArgs parameter            e.Message += String.Format(" at {0}", DateTime.Now.ToString());            // Use the () operator to raise the event.            handler(this, e);        }    } }

Пример

В следующем примере демонстрируются предыдущие шаги, полученные при использовании пользовательского класса EventArgs и EventHandler<<(Of <TEventArgs>>)> в качестве типа события.

ß---


 

//Class that subscribes to an event

class Subscriber

 {

   private string id;

   public Subscriber(string ID, Publisher pub)

   {

       id = ID;

       // Subscribe to the event using C# 2.0 syntax

       pub.RaiseCustomEvent += HandleCustomEvent;

   }

 

   // Define what actions to take when the event is raised.

   void HandleCustomEvent(object sender, CustomEventArgs e)

   {

       Console.WriteLine(id + " received this message: {0}", e.Message);

   }

}

 

class Program

{

   static void Main(string[] args)

   {

       Publisher pub = new Publisher();

       Subscriber sub1 = new Subscriber("sub1", pub);

       Subscriber sub2 = new Subscriber("sub2", pub);

 

       // Call the method that raises the event.

        pub.DoSomething();

 

       // Keep the console window open

       Console.WriteLine("Press Enter to close this window.");

       Console.ReadLine();

 

   }

}

}


 

 

ß----


Дата добавления: 2019-03-09; просмотров: 231; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!