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

通过EventHandler传递返回值分享

时间:2023-04-10 18:18:42 C#

通过EventHandler返回返回值我正在尝试写入一个API,我需要在从表中获取数据时调用事件处理程序。像这样:publicoverrideboolRun(Company.APIapi){SomeInfo_someInfo=newSomeInfo();如果(_someInfo.Results==1)返回真;否则返回假;使用(MyTabletable=newMyTable(api)){table.WhenData+=newEventHandler(table_WhenData);table.WhenDead+=newEventHandler(table_WhenDead);表.开始();}publicvoidtable_WhenData(objectsender,DataEventArgse){returntrue;我遇到的问题是我不知道如何将table_WhenData的返回值传递回Run方法。我已经尝试了很多事情(比如尝试将_someInfo传递给方法),但我似乎无法获得正确的语法。任何意见是极大的赞赏。这里的常见模式不是从事件处理程序返回任何数据,而是向事件参数对象添加属性,以便事件的消费者可以设置调用者随后可以访问的属性。这在UI处理代码中很常见;您会随处看到取消事件的概念。以下是伪代码,未准备好编译。它的目的是展示模式。publicMyEventArgs:EventArgs{publicboolCancel{get;set;}}publicboolfireEvent(){MyEventArgse=newMyEventArgs();//不要忘记空检查,假设这是一个事件FireEventHandler(this,e);返回e.Cancel;}publicHandleFireEvent(objectsender,MyEventArgse){e.Cancel=true;}编辑我喜欢JonSkeet的措辞:让EventArgs可变。也就是说,事件的消费者可以修改EventArgs对象的状态,从而允许事件的引发者获取该数据。我知道这是一篇旧文章,但万一有人看到它,绝对可以这样做。您声明自己的委托,它返回一个值,然后将事件基于这个新委托。这是一个示例:在事件声明者/发布者中://委托publicdelegatestringReturnStringEventHandler(objectsender,EventArgsargs);//事件publiceventReturnStringEventHandlerStringReturnEvent;//引发事件protectedvoidOnStringReturnEvent(EventArgse){if(StringReturnEvent!=null)//确保至少有一个订阅者//注意事件正在返回一个字符串stringmyString=StringReturnEvent(this,e);}InSubscriber://订阅事件,可能在类构造函数/初始化方法中StringReturnEvent+=HandleStringReturnEvent;//处理事件,返回数据privatestringHandleStringReturnEvent(objectsender,EventArgse){return"astringtoreturn";.NET在AssemblyResolve事件中提供了一个示例,它使用ResolverEvent委托返回数据,在本例中是对所需程序集的引用。关于AssemblyResolve事件的MSDN文章我个人使用了AssemblyResolve事件和自定义委托技术从事件中返回数据,它在VisualStudio2010上都按预期工作。唯一可以做到的方法是制作一个参数(最好是“args”而不是发送者)可变。如果它还不是可变的,那么您基本上就有问题了——没有办法获取信息。(好吧,有一种方法-你可以保持事件参数本身不可变,但是让它的一个成员成为一个方法,它最终调用你的代码注册的委托,首先引发事件。但这太可怕了。..)A简单的解决方法就是使用闭包:以上是C#学习教程:通过EventHandler返回返回值分享的所有内容,如果对大家有用需要详细了解C#学习教程,希望大家多多关注——publicoverrideboolRun(){SomeInfosomeInfo=...table.WhenData+=(obj,args)=>{someInfo.Return=something};}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: