我使用反射为事件添加事件处理程序:
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通过某种界面方法就可以了。
答案 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)
疯狂思考。
对于您要添加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?
}