gpt4 book ai didi

c# - 如何获取 Enumerable.SequenceEqual 的 MethodInfo

转载 作者:太空狗 更新时间:2023-10-30 01:02:41 25 4
gpt4 key购买 nike

我正在尝试使用 Type.GetMethod(...) 获取 Enumerable.SequenceEqualMethodInfo。到目前为止,我已经尝试了以下方法:

var mi = typeof(Enumerable).GetMethod(nameof(Enumerable.SequenceEqual),
BindingFlags.Static | BindingFlags.Public, null, CallingConventions.Any,
new Type[] { typeof(IEnumerable<>), typeof(IEnumerable<>) }, null);

var enumTyped = typeof(IEnumerable<>).MakeGenericType(ValueType);
var mi = typeof(Enumerable).GetMethod(nameof(Enumerable.SequenceEqual),
BindingFlags.Static | BindingFlags.Public, null, CallingConventions.Any,
new Type[] { enumTyped, enumTyped }, null);

但是,这两种解决方案都返回 null 而不是我想要的方法。我知道可以通过调用 GetMethods() 和过滤来检索该方法,但我非常想知道如何使用 GetMethod(...) 检索它。

最佳答案

不幸的是,为了使用Type.GetMethod(string name, Type[] types) 获得通用泛型方法。您必须在 Type[] 中为方法提供正确的泛型类型,这意味着当您尝试这样做时:

Type requiredType = typeof(IEnumerable<>);
typeof(Enumerable).GetMethod("SequenceEqual", new Type[] { requiredType, requiredType });

你实际上需要做这样的事情:

Type requiredType = typeof(IEnumerable<TSource>);
typeof(Enumerable).GetMethod("SequenceEqual", new Type[] { requiredType, requiredType });

因为如果您查看 SequenceEqual 的签名, 通用类型是 IEnumerable<TSource>不是IEnumerable<> .

public static IEnumerable<TSource> SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);

但是您无权访问 TSource 类型为了使用它。所以获得IEnumerable<TSource>的唯一方法正在使用如下反射:

MethodInfo info = typeof(Enumerable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(x => x.Name.Contains("SequenceEqual"))
.Single(x => x.GetParameters().Length == 2);
Type genericType = typeof(IEnumerable<>).MakeGenericType(infos.GetGenericArguments());

并且比获取方法使用

typeof(Enumerable).GetMethod("SequenceEqual", new Type[] { genericType, genericType });

但这需要我们得到 SequenceEqual无论如何都是方法,所以可悲的事实是,当使用 GetMethod 的重载很少时,让该方法成为通用方法而不是 GetMethods这几乎是不可能的* (你 可以 实现一个 Binder 并在 GetMethod 方法中使用它,但它需要非常冗长的编码可能会出现错误且无法维护,应避免)

关于c# - 如何获取 Enumerable.SequenceEqual 的 MethodInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com