gpt4 book ai didi

c# - 从 C# 中的 EventHandler 确定事件名称

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:23 25 4
gpt4 key购买 nike

我的问题是我是否可以确定通过 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 是一个自定义接口(interface),用于日志记录。我这样调用方法:

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

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

最佳答案

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

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

关于c# - 从 C# 中的 EventHandler<T> 确定事件名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com