我使用的是.net Core 5.0.302,在使用Reflection呼叫一個泛型方法時遇到困難
。該函式是
public static T Parse< T>(List<Token> tokenList, int startPos) where T : new(){
if(tokenList[startPos].tokenData.ToString() == " ["){
// ParseArray(tokenList);。
拋出 new NotImplementedException();
}
else if(tokenList[startPos].tokenData.ToString() == "{"/span>){
return ParseObject<T>(tokenList, startPos) 。
}else{
T retVal = new T()。
retVal = (T)tokenList[startPos].tokenData;
return retVal;
}
試圖呼叫這個方法的代碼在這里 -
MethodInfo method = typeof(JsonParser).GetMethod(nameof(JsonParser.Parse), BindingFlags.Static | BindingFlags.Public)。
method = method.MakeGenericMethod(typeof(string)。
object parsedType = method. Invoke(null, new object[]{tokenList, i 3}) 。
props[z].SetValue(typeInst, parsedType)。
而這是我收到的錯誤資訊
System.Security.VerificationException : Method ParseLib.JsonParser.Parse: type argument 'System.String' violates the constraint of type parameter 'T'.
堆疊跟蹤。
at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
at ParseLib.JsonParser.ParseObject[T](List1 tokenList, Int32 startPos) in /home/user/Projects/MyProjects/JsonParseSharp/ParseLib/JsonParser. cs:第54行 at ParseLib.JsonParser.Parse[T](List1 tokenList, Int32 startPos) in /home/user/Projects/MyProjects/JsonParseSharp/ParseLib/JsonParser.cs:行 15
at ParseTests.JsonParserTest.TestParseBasicObject() in /home/user/Projects/MyProjects/JsonParseSharp/ParseTests/JsonParserTest.cs:line 16
----- 內部堆疊跟蹤 -----
at System.RuntimeMethodHandle.GetStubIfNeeded(RuntimeMethodHandleInternal method, RuntimeType declaringType, RuntimeType[] methodInstantiation)
在System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
我還沒有弄清楚為什么System.String違反了型別引數'T',如果我把typeof(string)替換成typeof(int),一切都會如期進行。有誰知道這里的問題是什么嗎?
預先感謝!
uj5u.com熱心網友回復:
where T : new()
你的Parse方法有一個型別約束,表明型別T必須有一個公共的無引數建構式。
在c#中,字串建構式需要至少一個引數來構造一個字串。
var str = new string("abc")
var num = new int()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318642.html
標籤:
上一篇:為什么編譯器給了我這個,不能從CompletableFuture<Object>轉換到CompletableFuture<String>?
下一篇:基于另一個陣列對陣列中的值求和
