如何在被调用的方法中获取事件名称

时间:2013-05-16 14:59:19

标签: c# events reflection types delegates

我使用反射为事件添加事件处理程序:

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,所以我可以通知对象O通过某种界面方法就可以了。

2 个答案:

答案 0 :(得分:2)

通过引入额外的抽象级别来解决问题是没有问题的!

这样的绑定事件:

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

答案 1 :(得分:0)

疯狂思考。

对于您要添加TestMethodbefore 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?
}