我有一个用户控件,它在与 Web 服务通信后引发事件。父级在引发时处理此事件。我认为正确的方法是将从网络服务返回的对象作为 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?);
}
Parent
ctrl_Login.LoginCompleted += ctrl_Login_LoginCompleted;
....snip....
void ctrl_Login_LoginCompleted(object sender, EventArgs e)
{
//get my object returned by login
}
所以我的问题是将用户对象返回给父对象的“批准”方法是什么?创建一个所有东西都可以访问的属性类并将其放在那里?
最佳答案
您必须使用 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
之后的最后一个处理程序的竞争条件场景中。检查但在实际调用处理程序之前。
关于c# - 如何在 EventArgs 中传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14977927/