1

我正在学习如何与代表合作,现在已经有了一些想法。在 C# 代码(如下)中,我喜欢在字符串中捕获事件类型。获取事件来源和事件类型的最佳方法是什么?

对于我正在使用的来源的名称,sender.GetType().FullName.ToString();如果它是正确的。事件类型呢?

谢谢。

protected virtual void OnChanged(EventArgs e)
{
    if (Changed != null)
        Changed(this,e);
}

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    OnChanged(EventArgs.Empty);
}



public EventListener(myForm theform)
{
    TheForm = theform;
    TheForm.Changed += new ChangedEventHandler(myMethod);
}

private void myMethod(object sender, EventArgs e)
{

    string s = "hey, got notified " + sender.GetType().FullName.ToString();
    MessageBox.Show(s);
}
4

5 回答 5

1

无法知道哪个事件调用了EventArgs该类的函数。

如果您正在使用准备好的事件(如 Click 事件),您可以像这样创建自己的“Args”类:

public class MyEventArgs : EventArgs
{
    public string EventCallerName { get; set; }
}

然后像这样调用事件:

 if (Changed != null)  
        Changed(this,new MyEventArgs() { EventCallerName = "Changed" });  

在接收器方法中,您可以看到该值,如下所示:

private void myMethod(object sender, EventArgs e) 
{ 
    if (e is MyEventArgs)
        MessageBox.Show("Event type: " + (e as MyEventType).EventCallerName); 
    string s = "hey, got notified " + sender.GetType().FullName.ToString(); 
    MessageBox.Show(s); 
} 

但是,如果您使用自己的事件,您可以创建自己的委托并随心所欲地使用它。

于 2012-10-11T19:27:26.953 回答
0

您应该能够使用StackTrace找到事件的来源。我相信您会发现事件通常由名称与事件名称相似的受保护函数触发。

于 2012-10-11T19:24:40.760 回答
0

事件的支持类型是委托。无法确定来自事件处理程序的事件源。但是,您可以在订阅事件时检查委托类型。定义\发布事件的类将是事件源,委托的类型将是事件类型。

于 2012-10-11T19:28:11.440 回答
0

这可能是正确的解决方案吗?:

        private void Form1_FormClosed(object sender, EventArgs e)
        {
            var eventType = e.ToString().Split('.').Last().Replace("EventArgs", ""); //eventType = "FromClosed"
        }
于 2012-10-11T19:29:47.637 回答
0

假设您想要事件的名称,而不是检测为什么在为事件注册处理程序时不修复它?就像是:

public EventListener(myForm theform)
{
    TheForm = theform;
    TheForm.Changed += (s, e) => this.MyMethod(s, e, "Changed");
}

private void MyMethod(object sender, EventArgs e, string eventName)
{
    string s = "hey, got notified " + sender.GetType().FullName.ToString();
    MessageBox.Show(s);
}
于 2012-10-11T19:35:52.237 回答