比较代表行动欢迎质疑我的理智。我需要确定Action与Action是否是原始实例。我所拥有的是一个类受保护的ActionMessageCallback类变量=null;当我的抽象类Message通过抽象方法创建时,我强制“他们”初始化MessageCallBack。此MessageCallback添加到IList。此列表中定义的每个操作都可以不同。现在,我要做的是从列表中删除一个特定的操作,但我并不是要比较它。这是我最后一次尝试设置的示例:publicvoidUnsubscribe(ActionmessageCallback){varmessageType=typeof(TMessage);varcallbackTypes=messageReceivedCallbacks.Keys.Where(k=>k.IsAssignableFrom(messageType));lock(messageReceivedCallbacks){foreach(varcallbackTypeincallbackTypes){messageReceivedCallbacks[callbackType].Remove(newAction(m=>messageCallback((TMessage)m)));}}}我知道我想做的事情可能是不可能的,但通常我只是在做一些不当的事情,或者缺乏适当的知识,就像我想的那样。提前感谢您提供的任何帮助。比较它们总是失败。以下3条建议均无效。我相信我可以改变我处理它的方式,并通过传入一个键然后指向单独的然后按索引删除它来使它按照我需要的方式工作。但是,我觉得我仍然需要付出很多努力才能解决这个问题,所以我会提供更多信息,看看是否有帮助。这是清单:privatereadonlyIDictionary>messageReceivedCallbacks;以下是向列表中添加操作的方法:varreceivedList=messageReceivedCallbacks.GetOrCreateValue(typeof(TMessage),()=>newList());锁(receivedList){receivedList.Add(intermediateReceivedCallback);高级编码更新。据我所知,由于new关键字,这使我无法进行直接实例比较。在我上面发布的(第一次)尝试中,我试图让我的回调匹配添加它的表单。这是行不通的。我试过比较目标、方法,甚至将每个方法转换为不同的类型,然后进行比较。我决定转换我传递的回调,就像它被添加到最后一个又名:varcallbackConverted=newAction(m=>messageReceivedCallback((TMessage)m));接下来,我使用即时窗口获取一些信息(回调是其中的一个列表,callbackConverted是我传入的那个):callback.Target{MessageBus.MessageCoordinator.}messageReceivedCallback:{Method={Voidb__0(Tests.MessageBus.TestMessage)}}callback.Method{Voidb__8(System.Object)}[System.Reflection.RuntimeMethodInfo]:{Voidb__8(System.Object)}base{System.Reflection.MethodBase}:{Voidb__8(System.对象)}MemberType:方法ReturnParameter:{Void}ReturnType:{Name=“Void”FullName=“System.Void”}ReturnTypeCustomAttributes:{Void}callbackConverted.Target{MessageBus.MessageCoordinator.}messageReceivedCallback:{Method={Voidb__0(Tests.MessageBus.TestMessage)}}messageType:{Name="TestMessage"FullName="Tests.MessageBus.TestMessage"}callbackConverted.Method{Voidb__1d(System.Object)}[System.Reflection.RuntimeMethodInfo]:{Voidb__1d(System.Object)}基础{System.Reflection.MethodBase}:{Voidb__1d(System.Object)}MemberType:MethodReturnParameter:{Void}ReturnType:{Name="Void"FullName="System.Void"}ReturnTypeCustomAttributes:{Void}我希望这个额外的信息能帮助我找到我把它弄得太复杂了。我需要做的就是添加我的动作,然后从每个字典(它的唯一实例)中删除。我正在尝试做一些复杂的事情。目前没有提供我可以肯定地说的方法,但我正在标记一个我认为其他人会使用最佳镜头的答案。感谢所有做出贡献的人。您是在谈论寻找做同样事情的操作,还是寻找完全相同事情的实例?如果它是完全相同的实例,您可以使用:messageReceivedCallbacks[callbackType].Remove(messageCallback);如果你想比较方法体,你可以这样做:varfirstMethodBody=firstAction.Method.GetMethodBody().GetILAsByteArray();varsecondMethodBody=secondAction.Method.GetMethodBody().GetILAsByteArray();如果(firstMethodreBody.Length!=secondMethodLength)false;for(vari=0;iactionOne=(param1)=>{return;};ActionactionTwo=(param2)=>{vari=1;return;};ActionactionThree=(param1)=>{return;};动作actionFour=(param2)=>{Thread.Sleep(1);return;};varareEqualOneTwo=ActionComparer(actionOne,actionTwo);varareEqualOneThree=ActionComparer(actionOne,actionThree);varareEqualOneFour=ActionComparer(actionOne,actionFour);Console.WriteLine("动作一对二:"+areEqualOneTwo);Console.WriteLine("动作一对三:"+areEqualOneThree);Console.WriteLine("动作一对四:"+areEqualOneFour);结果:由于RenniePet的评论没有编译器优化动作一对二:假动作一对三:真动作一对四:假使用编译器优化动作一对二:真动作一对三:真动作一对四:假但请注意第一行和第二行之间的比较,这会有用吗?messageReceivedCallbacks[callbackType].Remove(messageReceivedCallbacks[callbackType].FirstOrDefault(x=>x.Target==messageCallback.Target&&x.Method==messageCallback.Method));判断两个delegate是否相同,只需要比较方法Andtargetaudience:以上是C#学习教程:比较代表action共享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——varlist=messageReceivedCallbacks[callbackType];对于(vari=list.Count-1;i>=0;i--)if(list[i].Method==messageCallback.Method&&list[i].Target==messageCallback.Target)list.RemoveAt(我);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: