2

リフレクションを使用して、イベント ハンドラーをイベントに追加しています。

var eventInfo = type.GetEvent(eventName);
MethodInfo mi = GetType().GetMethod("TestMethod", 
           BindingFlags.Instance | BindingFlags.NonPublic);
var delegateForMethod = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, mi);
eventInfo.AddEventHandler(this, delegateForMethod);

これは、イベントが発生したときにテスト メソッドを正常に呼び出しますが、このメソッドを呼び出したイベントの名前を知る必要があります...

void TestMethod(object sender, EventArgs e)
{
    // I know the sender, but which event was fired on the sender?
}

これが必要な理由は、ハンドラーをさまざまなタイプ、さまざまなイベントに接続し、それらすべてを 1 つのメソッドにチャネルするこのジェネリック レジスタ メソッドがあるためです。テスト メソッドが起動したら、そのメモを取り出し、その情報を使用して、「目的の」イベントが起動したことを正しいオブジェクトに通知する必要があります。-- しかし、これを知るには、イベント名とタイプを知る必要があります。

たとえば、レジ​​スターで、オブジェクト O のタイプ X にイベント A を追加しました... テスト メソッドでトリガーされたのを確認したら、それがタイプ X のイベ​​ント A であったことを知る必要があるため、オブジェクト O に a で通知できます。その上の特定のインターフェースメソッド。

4

2 に答える 2

3

追加の抽象化レベルを導入しても解決できない問題はありません。

次のようにイベントをバインドします。

obj.SomeEvent += (sender, args) => TestMethod("SomeEvent", sender, args);

または反射によって:

var eventInfo = type.GetEvent(eventName);
EventHandler delegateForMethod = (o, args) => TestMethod(eventInfo.Name, o, args);
eventInfo.AddEventHandler(this, delegateForMethod);

そしてハンドラでは、パラメータからイベント名にアクセスできます:

void TestMethod(string eventName, object sender, EventArgs e)
{
    // eventName is event was fired on the sender
    TestMethod(sender, e);
}
于 2014-01-29T11:41:19.007 に答える
0

ここでクレイジーな考え。

を追加するすべてのイベントにTestMethodbefore TestMethodを追加します。これは、理解のためanonimous methodに呼び出します。SetEventName

それは、あなたのクラスにSetEventNameいくつかの変数を設定するだけです. (そのためにラムダ式を使用する方法があると思います)。GlobalEventNameeventName

したがって、イベントが発生するたびに。SetEventNameと呼ばれます。あなたGlobalEventNameが設定されています。その後TestMethod、呼び出されます。内部TestMethodでは、 を使用しGlobalEventNameて作業を行います。


アイデアを見る

var eventInfo = type.GetEvent(eventName);

Action<object, EventArgs> SetEventName = (Ob, Args) => GlobalEventName = eventName;
//I really don't know if it would work but....

Add that to the eventInfo before adding the TestMethod.

MethodInfo mi = GetType().GetMethod("TestMethod", 
       BindingFlags.Instance | BindingFlags.NonPublic);
var delegateForMethod = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, mi);
eventInfo.AddEventHandler(this, delegateForMethod);

そしてあなたのテスト方法:

void TestMethod(object sender, EventArgs e)
{
    //Use the GlobalEventName to get event's name.
    // I know the sender, but which event was fired on the sender?
}
于 2013-05-16T16:52:58.530 に答える