Подтвердить что ты не робот

Как передать объекты в EventArgs

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

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

UserControl

public event EventHandler LoginCompleted;

а затем после того, как служба возвращает объект biz:

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
    }

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

4b9b3361

Ответ 1

Вам нужно объявить свое событие, используя 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, но до фактического вызова обработчика.

Ответ 2

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

Например: public delegate void MyEventEventHandler (int prop1, string prop2, object prop3...);

публичное событие MyEventEventHandler MyEvent;