因此,我们最近将我们的项目从.net框架4.7.2迁移到了.net 6,我们正在测试代码以解决任何问题,而测试时我发现.net 6中没有使用下面的.net方法
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 MaxTSource,TResult“。
它在.net框架4.7.2中运行良好,但在测试.net 6中迁移的代码时,它抛出了"ArrayOutOfBoundsException“,因此我尝试将上面的代码更改为下面的代码,以便从.Net 6中的可枚举方法获得相同的结果。
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:“类型或方法有一个泛型参数,但提供了两个泛型参数。必须为每个泛型参数提供一个泛型参数。”我不知道下一步该怎么解决这个问题,如果有任何帮助,我们将不胜感激。
发布于 2022-11-04 11:08:04
为了防止新的或已删除的重载破坏代码,您可以更多地确定所需的重载。此外,此代码与方法顺序无关,并将产生所需的重载或抛出异常:
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])发布于 2022-11-03 22:53:37
更新:发现问题
我们正在寻找的方法是:
TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,TResult])在.net框架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://stackoverflow.com/questions/74310069
复制相似问题