通过反射订阅任意事件类型的操作};事件的争论无关紧要,我不需要他们,我对他们不感兴趣。我只想调用Foo()。没有明显的方法可以通过反射来做同样的事情。我想将上面的内容翻译成类似voidFoo(){/*发射导弹等*/}voidBar(objectobj,EventInfoinfo){ActioncallFoo=Foo;info.AddEventHandler(obj,callFoo);此外,我不想假设传递给Bar的对象类型严格遵守使用事件的EventHander(TArgs)签名的准则。简而言之,我正在寻找一种方法来将Action订阅到任何处理程序类型;简而言之,一种将Action委托转换为预期处理程序类型的委托的方法。staticvoidAddEventHandler(EventInfoeventInfo,objectitem,Actionaction){varparameters=eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters().Select(parameter=>Expression.Parameter(parameter.ParameterType)).ToArray();varhandler=Expression.Lambda(eventInfo.EventHandlerType,Expression.Call(Expression.Constant(action),"Invoke",Type.EmptyTypes),parameters).Compile();eventInfo.AddEventHandler(项目,处理程序);}staticvoidAddEventHandler(EventInfoeventInfo,objectitem,Actionaction){varparameters=eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters().Select(parameter=>Expression.Parameter(parameter.ParameterType)).ToArray();varinvoke=action.GetType().GetMethod("调用");varhandler=Expression.Lambda(eventInfo.EventHandlerType,Expression.Call(Expression.Constant(action),invoke,parameters[0],parameters[1]),parameters).Compile();eventInfo.AddEventHandler(项目,处理程序);}用方法:动作action=()=>BM_21_Grad.LaunchMissle();foreach(vareventInfoinform.GetType().GetEvents()){AddEventHandler(eventInfo,form,action);}这个怎么样?以上就是C#学习教程:通过反射对任意事件类型的订阅操作分享的所有内容,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注—voidBar(objectobj,EventInfo信息){varparameters=info.EventHandlerType.GetMethod("Invoke").GetParameters().Select(p=>Expression.Parameter(p.ParameterType));varhandler=Expression.Lambda(info.EventHandlerType,Expression.Call(Expression.Constant(obj),//obj是Foo()"Foo",//将被称为null的实例,参数);info.AddEventHandler(obj,handler.Compile());}本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处:
