所以我們最近將我們的專案從 .net framework 4.7.2 遷移到 .net 6 并且我們正在測驗代碼是否存在任何問題,同時測驗我發現 Max 的以下方法在 .net 6 中不起作用
var maxOfStringMethod = (from method in typeof(Enumerable).GetMethods()
where method.Name == "Max"
&& method.GetParameters().Length == 2 &&
method.GetParameters()[1].ParameterType.GenericTypeArguments[1].IsGenericParameter
select method).First().MakeGenericMethod(new Type[] { typeof(SomeViewModel), typeof(string) });
以上代碼方法適用于“TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable 1[TSource], System.Func2[TSource,TResult])”。
它在 .net framework 4.7.2 中運行良好,但是在 .net 6 中測驗遷移的代碼時會拋出“ArrayOutOfBoundsException”所以我嘗試將上面的代碼更改為以下代碼,以便從 .Net 6 中的 Enumerable 方法獲得相同的結果
var maxOfStringMethod = (from method in typeof(Enumerable).GetMethods()
where method.Name == "Max"
&& method.GetParameters().Length == 2 &&
method.GetParameters()[0].ParameterType.GenericTypeArguments[0].IsGenericParameter
select method).ElementAt(1).MakeGenericMethod(new Type[] { typeof(SomeViewModel), typeof(string) });
現在它拋出“System.ArgumentException:'該型別或方法有 1 個泛型引數,但提供了 2 個泛型引數。必須為每個泛型引數提供一個泛型引數。” “我不知道接下來該怎么解決這個問題,任何幫助將不勝感激
uj5u.com熱心網友回復:
為了防止新的或洗掉的多載破壞您的代碼,您可以更多地確定所需的多載。此外,此代碼獨立于方法順序,將產生所需的多載或引發例外:
var maxOfStringMethod = typeof(Enumerable).GetMethods()
.Single(x => x.Name == nameof(Enumerable.Max)
&& x.GetGenericArguments().Length == 2
&& x.GetParameters().Length == 2
&& x.GetParameters()[0].ParameterType == typeof(IEnumerable<>).MakeGenericType(x.GetGenericArguments()[0])
&& x.GetParameters()[1].ParameterType == typeof(Func<,>).MakeGenericType(x.GetGenericArguments())
&& x.ReturnType == x.GetGenericArguments()[1]);
TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,TResult])
uj5u.com熱心網友回復:
更新:發現
我們正在尋找的問題方法是:
TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,TResult])
.net framework 4.7.2 中的上述方法在串列中排名第一,在 .net 6 中它在串列中排名最后
所以我將代碼更改為以下
var maxOfStringMethod = (from method in typeof(Enumerable).GetMethods()
where method.Name == "Max"
&& method.GetParameters().Length == 2 &&
method.GetParameters()[1].ParameterType.GenericTypeArguments[2].IsGenericParameter
select method).Last().MakeGenericMethod(new Type[] { typeof(SomeViewModel), typeof(string) });
它奏效了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528371.html
