从C#中的EventHandler <t>确定事件名称

时间:2015-10-04 12:16:20

标签: c# events logging eventhandler

我的问题是,我是否可以通过EventHandler类型的参数确定事件的名称?有了一些代码,它变得更加清晰:

this.RaiseEvent(this.ProductLeftEvent, new ProductLeftEventArgs() { ... });

正如您所看到的,我想创建一个方法,不仅可以调用事件异步,还可以记录操作。 IXmlConvertable是一个自定义接口,用于记录。我把这个方法称为:

mongoDB.getCollection("restaurants").updateOne(
    new BasicDBObject("name", "Morris Park Bake Shop"),
    new BasicDBObject("$set", new BasicDBObject("zipcode", "10462"))
);

我想获得的是一个包含&#34; ProductLeftEvent&#34;的字符串。不幸的是,eventToRaise.Method.Name给出了字符串&#34; DeliverEvent&#34;。你认为有可能实现这个名字吗?值得一提的是,我在处理一个处理程序时使用了弱事件管理器。

1 个答案:

答案 0 :(得分:1)

eventToRise参数是一个委托 - 即对方法(以及应该调用此方法的目标或对象)的引用。 Event包含对订阅该事件的所有方法的引用。

因此,在您的情况下,似乎“DeliverEvent”是在应用程序的其他部分附加到您的事件的方法,如下所示:someObject.ProductLeftEvent += this.DeliverEvent;

如果你真的想将事件本身传递给RaiseEvent方法,你需要使用表达式或者只是传递一个eventName(但这将是一种重复)。

以下是如何使用表达式执行此操作的示例:

public void RaiseEvent<T>(Expression<Func<EventHandler<T>>> eventToRaise, T args) where T : EventArgs, IXmlConvertable
{
    string eventName = ((MemberExpression)eventToRaise.Body).Member.Name;
    Log(eventName, args.ToXElement());
    EventHandler<T> eventHandler = eventToRaise.Compile()();
    ThreadPool.QueueUserWorkItem((e) => eventHandler(this, args));
}

您将这样调用此方法:

this.RaiseEvent(() => this.ProductLeftEvent, new ProductLeftEventArgs() { ... });