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



ЗНАЕТЕ ЛИ ВЫ?

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

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

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

a. Если пользовательский класс EventArgs отсутствует, ваш тип Event представляет собой не являющийся общим делегат 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();

 

}

}

}


 

 

ß----




Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 101; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.70.108 (0.006 с.)