繁体   English   中英

从EventHandler确定事件名称 <T> 在C#中

[英]Determine event name from EventHandler<T> in C#

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

public void RaiseEvent<T>(EventHandler<T> eventToRaise, T args) where T : EventArgs, IXmlConvertable
    {
        Log(eventToRaise.Method.Name, args.ToXElement());
        ThreadPool.QueueUserWorkItem((e) => eventToRaise(this, args));
    }

public event EventHandler<ProductLeftEventArgs> ProductLeftEvent = delegate { };

如您所见,我想创建一个不仅调用事件异步,而且记录操作的方法。 IXmlConvertable是一个自定义接口,用于记录日志。 我这样调用方法:

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

我想获得的是带有“ ProductLeftEvent”的字符串。 不幸的是,eventToRaise.Method.Name给出了字符串“ DeliverEvent”。 您认为有可能获得这个名字吗? 还值得一提的是,我在使用处理程序时使用了弱事件管理器。

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

因此,在您的情况下,似乎“ 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() { ... });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM