C# 使用C语言检测事件源和事件类型#

C# 使用C语言检测事件源和事件类型#,c#,C#,我正在学习如何与代表一起工作,现在我已经有了一些想法。在C代码(如下)中,我喜欢用字符串捕获事件类型。获取事件来源和事件类型的最佳方法是什么 对于我正在使用的源名称sender.GetType().FullName.ToString()如果它是正确的。事件类型如何 谢谢 protected virtual void OnChanged(EventArgs e) { if (Changed != null) Changed(this,e); } protected ove

我正在学习如何与代表一起工作,现在我已经有了一些想法。在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);
}

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

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

无法知道哪个事件使用
EventArgs
类调用函数

如果您正在使用准备好的事件(如Click event),您可以创建自己的“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); 
} 
然后像这样调用事件:

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); 
} 
在receiver方法中,您可以看到该值,如下所示:

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); 
} 

但是,如果您使用自己的事件,您可以创建自己的委托,并对其执行任何您想要的操作。

无法知道哪个事件使用
EventArgs
类调用函数

如果您正在使用准备好的事件(如Click event),您可以创建自己的“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); 
} 
然后像这样调用事件:

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); 
} 
在receiver方法中,您可以看到该值,如下所示:

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); 
} 

但是,如果您正在使用自己的事件,您可以创建自己的委托,并根据需要使用它。

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

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

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

        private void Form1_FormClosed(object sender, EventArgs e)
        {
            var eventType = e.ToString().Split('.').Last().Replace("EventArgs", ""); //eventType = "FromClosed"
        }

也许这是正确的解决方案

        private void Form1_FormClosed(object sender, EventArgs e)
        {
            var eventType = e.ToString().Split('.').Last().Replace("EventArgs", ""); //eventType = "FromClosed"
        }

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

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);
}

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

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);
}

您将“事件类型”称为什么?
事件的名称
?很难给你答案,你提供了一点信息,但并不清楚你需要什么…@AdamRobinson是的,这就是我的意思。所以在通知方法中,我需要捕获事件的名称和发送者,或者说事件的发布者。你称之为“事件类型”是什么?
事件的名称
?很难给你答案,你提供了一点信息,但并不清楚你需要什么…@AdamRobinson是的,这就是我的意思。所以在通知方法中,我需要捕获事件的名称和发送者,或者说事件的发布者。请注意,由于优化,StackTrace可能没有您期望的所有帧。请注意,由于优化,StackTrace可能没有您期望的所有帧。