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



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

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。

任何问题都可以通过引入额外的抽象级别来解决!

这样绑定事件:

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

在handler中,你可以从参数中访问事件名称:

void TestMethod(string eventName, object sender, EventArgs e)
{
    // eventName is event was fired on the sender
    TestMethod(sender, e);
}

你真是疯了。

您要添加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);

和你的testmethod:

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

相关内容

  • 没有找到相关文章

最新更新