2013-02-20 4 views
21

У меня есть usercontrol, который вызывает событие после связи с веб-службой. Родитель обрабатывает это событие при поднятии. Что я думал, что был бы правильным подходом, чтобы передать объект, возвращенный из webservice родительскому, как eventargs ???Как передать объекты в EventArgs

Если это правильно, я не могу найти инструкции о том, как это сделать.

UserControl

public event EventHandler LoginCompleted; 

потом после возвращения службы БИЗ объекта:

if (this.LoginCompleted != null) 
     { 
      this.LoginCompleted(this, new EventArgs() //this is where I would attach/pass my biz object no?); 
     } 

Родитель

ctrl_Login.LoginCompleted += ctrl_Login_LoginCompleted; 
....snip.... 
void ctrl_Login_LoginCompleted(object sender, EventArgs e) 
    { 
     //get my object returned by login 
    } 

Итак, мой вопрос в том, каким будет «одобренный» метод возврата объекта пользователя родительскому объекту? Создайте класс свойств, который все может получить и разместить там?

ответ

35

Вы должны объявить событие, используя EventHandler<T> где T ваш класс, производный от EventArgs:

public event EventHandler<LoginCompletedEventArgs> LoginCompleted; 

LoginCompletedEventArgs может выглядеть следующим образом:

public class LoginCompletedEventArgs : EventArgs 
{ 
    private readonly YourBusinessObject _businessObject; 

    public LoginCompletedEventArgs(YourBusinessObject businessObject) 
    { 
     _businessObject = businessObject; 
    } 

    public YourBusinessObject BusinessObject 
    { 
     get { return _businessObject; } 
    } 
} 

Использование будет выглядеть так:

private void RaiseLoginCompleted(YourBusinessObject businessObject) 
{ 
    var handler = LoginCompleted; 
    if(handler == null) 
     return; 

    handler(this, new LoginCompletedEventArgs(businessObject)); 
} 

Обратите внимание, как я реализовал RaiseLoginCompleted. Это поточно-безопасная версия для поднятия события. Я исключаю возможный NullReferenceException, который может возникать в сценарии условий гонки, когда один поток хочет поднять событие, а другой поток не подписывает последний обработчик после проверки if, но до фактического вызова обработчика.

+0

Это билет! Позвольте мне реализовать и вернуться. – GPGVM

+0

Вы бы хотели, чтобы собственность была чем-то иным, чем только для чтения. IE никогда не бывает ситуации, когда вы захотите установить ее иначе, чем через конструктор? – GPGVM

+0

@ user1278561: Возможны два случая: (1) Класс, который вызывает событие и создает экземпляр, хочет изменить это свойство. Этого не произойдет, потому что экземпляр не сохраняется нигде, он напрямую передается обработчику. (2) Обработчик событий хочет изменить это свойство. Вы не хотите этого делать, потому что другие подписчики этого события теперь получат другой экземпляр, чем тот, который предоставил класс повышения. –

3

Ну, вы могли бы сделать все это, или вы могли бы определить делегата как ваш EventHandler и определить свои свойства в его подписи.

Такие как: public delegate void MyEventEventHandler (int prop1, string prop2, object prop3 ...);

общественное мероприятие MyEventEventHandler MyEvent;

+1

Значительно чище и эффективнее ИМХО –

Смежные вопросы