当前位置: 首页 > 编程语言 > C#

是否可以在lambda表达式中定位EventHandler?分享

时间:2023-04-10 11:18:41 C#

是否可以在lambda表达式中定位EventHandler?举个简单的例子,如果我有某种按钮UI类,我可以编写一个函数来获取指向其Click事件处理程序的表达式:SomeMethod(button=>button.Click);我正在尝试消除系统当前使用Somemagicstring使事件等待的情况。有问题的代码来自FrankKrueger撰写的博客文章(如果您想了解一些背景知识,非常值得一读)。publicstaticTaskGetEventAsync(thisobjecteventSource,stringeventName)whereTEventArgs:EventArgs{//...Typetype=eventSource.GetType();EventInfoev=type.GetEvent(事件名称);//...}虽然内部细节可能并不重要,但完整的方法允许您使用事件触发器作为任务的完成源,从而使使用await更易于管理。对于引发事件的类,您可以通过简单的调用将该事件绑定到任务。任务eventTask=someEventCausingObject.GetEventAsync("SomeEventHandler");//传统上用作someEventCausingObject.SomeEventHandler+=...;等待事件任务;//引发SomeEventHandler事件时返回此处。我一直愉快地使用这个项目,但它有其缺点,其中最大的缺点是使用硬编码的事件名称字符串。这使得事件名称更改成为运行时异常,并且难以确定事件使用情况。我开始尝试创建一个允许EventHandler作为表达式的一部分传入的版本,目标是这样的:awaitsomeEventCausingObject.GetEventAsync(x=>x.SomeEventHandler);...具有相应的方法签名...publicstaticTaskGetEventAsync(thisTSourceeventSource,ExpressioneventHandlerExpression)whereTEventArgs:EventArgs{//...}不幸的是,调用代码中的lambda表达式导致编译错误:错误CS0070:当在类型“EventCausingClass”之外使用时,事件“SomeEventHandler”只能出现在+=或-=的左侧。考虑到事件处理程序的使用方式,这是有道理的,但我希望找到比预先指定的字符串名称更好的解决方案。搜索“表达式”和“事件处理程序”的组合似乎会被将其描述为以lambda表达式开头+=事件处理程序赋值的人所污染。我希望我在这里遗漏了一些明显的东西。不,无法定位事件。基本上,事件并不是真正的类型成员,而只是生成add_EventName和remove_EventName方法对的C#语法。您可以尝试引用这些内部方法名称,但在C#中是不可能的-http://msdn.microsoft.com/en-us/library/z47a7kdw.aspxSO中有很多类似的问题,答案是否定的-就像JonSkeet提出的这个问题https://stackoverflow.com/a/4756021/2170171如果你真的很疯狂,你可以尝试像privatestaticvoidSubscribe(ActionaddHandler){varIL=addHandler.Method.GetMethodBody().GetILAsByteArray();//魔术在这里,我们在其中了解ClassName和EventName???}用法如Subscribe(()=>newButton().Click+=null);您可以尝试Cecilhttp://www.mono-project.com/Cecil来分析IL,或者实现您自己的逻辑,因为它对于可预测的代码行来说应该不会太难。我不认为这是一个好的解决方案,因为它只是用另一个(正确的Subscribe调用)代替了一个令人头疼的问题(正确的事件命名)。虽然,重命名会有所帮助。以上是C#学习教程:IsitpossibletolocateEventHandlerinthelambdaexpression?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: