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

调用MethodInfo.MakeGenericMethod时出现这个关键错误是什么意思?分享

时间:2023-04-11 02:21:10 C#

调用MethodInfo.MakeGenericMethod时出现这个关键错误是什么意思?我今天从一些旧的动态转换代码中得到了这个错误(我已经更改了最后一行并省略了堆栈跟踪的其余部分):Itemhasalreadybeenadded。字典中的键:'Int32Count[Object](System.Collections.Generic.IEnumerable`1[System.Object])'添加的键:'Int32Count[Object](System.Collections.Generic.IEnumerable`1[System.对象])'--->System.ArgumentException:项目已经被添加。字典中的键:'Int32Count[Object](System.Collections.Generic.IEnumerable`1[System.Object])'添加的键:'Int32Count[Object](System.Collections.Generic.IEnumerable`1[System.Object])'`1[System.Object])'atSystem.Reflection.CerHashtable`2.Insert(K[]keys,V[]values,Int32&count,Kkey,Vvalue)atSystem.Reflection.CerHashtable`2.在System.RuntimeType.RuntimeTypeCache.GetGenericMethodInfo(RuntimeMethodHandlegenericMethod)在System.RuntimeType.GetMethodBase(RuntimeTypeHandlereflectedTypeHandle,RuntimeMethodHandlemethodHandle)在System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[]methodInstantiation)在MyNamespace.CommunicationExtensions.BuildMessage[T](Tobj)全类publicstaticclassCommunicationExtensions{静态只读对象lockobj=newobject();publicstaticboolCanBuildMessage(thisTobj)whereT:class{returnobj!=null&&(MessageFactory.MessageBuilders.ContainsKey(obj.GetType()));}publicstaticstringBuildMessage(thisTobj){lock(lockobj){Delegated;vartype=obj.GetType();如果(MessageFactory.MessageBuilders.TryGetValue(type,outd)){varcastMethod=typeof(CommunicationExtensions).GetMethod("Cast").MakeGenericMethod(type);varcastedObject=castMethod.Invoke(null,newobject[]{obj});将d.DynamicInvoke(castedObject)作为字符串返回;}}返回空值;}publicstaticTCast(objecto){return(T)o;MessageFactory.MessageBuilders是一个Dictionary包含编译的lambda表达式,这些表达式根根据需要延迟构建以将Message事件(一个基于EventArgs的简单自动属性类)转换为其他系统中使用的字符串格式,我认为这无关紧要。我认为导致此问题的唯一代码是:publicstaticclassCastError{publicstaticvoidGetCast(thisTobj){vartype=obj.GetType();varcastMethod=typeof(CastError).GetMethod("Cast").MakeGenericMethod(类型);//...}publicstaticTCast(objecto){return(T)o;框架似乎无法正确锁定MakeGenericMethod的内部结构。调用MakeGenericMethod时,框架应使用指定的泛型参数创建该方法的新版本,或者如果在创建该泛型方法之前使用了相同的泛型参数类型,则它应返回先前生成的方法。看起来你遇到了一个边缘情况,在多个线程上调用MakeGenericMethod可能会导致竞争条件,两个线程都认为该方法尚未生成并继续生成它,然后随后与存储生成的方法以供将来调用发生冲突.也就是说,在这种情况下,它似乎都被锁定了,所以我也不完全相信这就是问题所在。我将此作为MSFT的错误提交,除非其他人可以解释这是预期的行为。以上就是C#学习教程:调用MethodInfo.MakeGenericMethod时出现这个关键错误是什么意思?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢