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?
}

我需要这个的原因是因为我有这个通用的注册方法,它将处理程序连接到不同的类型和不同的事件,并将它们全部引导到一个方法,同时还记下附加的内容。一旦测试方法触发,我需要取出该注释并使用该信息通知正确的对象他们的“期望”事件已触发。-- 但要知道这一点,我需要知道事件名称和类型。

例如,在寄存器中,我为对象 O. 添加了类型 X 中的事件 A.... 现在当我看到它在测试方法中触发时,我需要知道它是类型 X 中的事件 A,所以我可以通过 a 通知对象 O某种接口方法就可以了。

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

在这里胡思乱想。

对于您要添加的每个事件TestMethod,您都before TestMethod添加一个anonimous method,我将调用它SetEventName以供理解。

SetEventName只是GlobalEventName在你的课堂上设置了一些变量eventName。(我想有一种方法可以使用 lambda 表达式)。

因此,每次触发事件时。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 回答