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

标签 c# eventargs

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

相关文章:

c# - 事件 Action 和事件 EventHandler<EventArgs> 之间的区别

c# - Count 和 Group By 的 Linq 优化

c# - C# 中的 Proto2 与 Proto3

c# - 如何对可为空的日期使用空合并运算符

C# 自定义 EventArgs 问题

c# - 如何将作为参数传递的 KeyValuePair 转换为 Command_Executed?

C# - 如果列表包含列表

c# - 对象类型是否包含 protected 虚拟 Finalize 方法?

c# - 我的类不能用作泛型类型中的类型参数 'TEventArgs' 或 .Net 4 中的方法 'System.EventHandler<TEventArgs>'

c# - 为什么使用 EventArgs.Empty 而不是 null?