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

イベントのバッキングタイプはデリゲートです。イベントハンドラからのイベントソースを特定できません。ただし、イベントをサブスクライブするときにデリゲートタイプを確認できます。イベントを定義/公開するクラスはイベントソースになり、デリゲートのタイプはイベントタイプになります。

于 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

StackTraceを使用して、イベントのソースを見つけることができるはずです。イベントは通常、イベント名に似た名前を持つ保護された関数によって起動されることがわかると思います。

于 2012-10-11T19:24:40.760 に答える
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 に答える