gpt4 book ai didi

c# - 如何在 EventArgs 中传递对象

转载 作者:行者123 更新时间:2023-12-03 08:55:06 27 4
gpt4 key购买 nike

我有一个用户控件,它在与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com