我的问题是,我是否可以通过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"))
);
我想获得的是一个包含" ProductLeftEvent"的字符串。不幸的是,eventToRaise.Method.Name给出了字符串" DeliverEvent"。你认为有可能实现这个名字吗?值得一提的是,我在处理一个处理程序时使用了弱事件管理器。
答案 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() { ... });