首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MakeGenericMethod For Max不在.Net 6中工作

MakeGenericMethod For Max不在.Net 6中工作
EN

Stack Overflow用户
提问于 2022-11-03 22:06:22
回答 2查看 42关注 0票数 0

因此,我们最近将我们的项目从.net框架4.7.2迁移到了.net 6,我们正在测试代码以解决任何问题,而测试时我发现.net 6中没有使用下面的.net方法

代码语言:javascript
复制
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中的可枚举方法获得相同的结果。

代码语言:javascript
复制
  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:“类型或方法有一个泛型参数,但提供了两个泛型参数。必须为每个泛型参数提供一个泛型参数。”我不知道下一步该怎么解决这个问题,如果有任何帮助,我们将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-04 11:08:04

为了防止新的或已删除的重载破坏代码,您可以更多地确定所需的重载。此外,此代码与方法顺序无关,并将产生所需的重载或抛出异常:

代码语言:javascript
复制
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]);

代码语言:javascript
复制
TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,TResult])
票数 1
EN

Stack Overflow用户

发布于 2022-11-03 22:53:37

更新:发现问题

我们正在寻找的方法是:

代码语言:javascript
复制
TResult Max[TSource,TResult](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,TResult])

在.net框架4.7.2中,上述方法在列表中排在第一位,在.net 6中在列表中排在最后

因此,我将代码更改为

代码语言:javascript
复制
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) });

而且起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74310069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档