我正在使用反射来为事件添加事件处理程序:
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?
}