将正确的类型参数传递给MethodInfo GetMethod

我知道我可以使用像这个问题这样的技术来获得我的方法。

例如

MethodInfo firstMethod = typeof(Enumerable) .GetMethods(BindingFlags.Public | BindingFlags.Static) .First(m => m.Name == "FirstOrDefault" && m.GetParameters().Length == 1) 

我想简化那个过程。

我正在寻找Enumerable.FirstOrDefault方法(IEnumerable)

我试过了两个

 // I'm just using string just as an example. var enumerableType = typeof(IEnumerable).MakeGenericType(typeof(string)); MethodInfo firstMethod = typeof(Enumerable) .GetMethod("FirstOrDefault", new Type[] { enumerableType }); 

 MethodInfo firstMethod = typeof(Enumerable) .GetMethod("FirstOrDefault", Type.EmptyTypes); 

但两者都返回null

什么是正确的方法?

不幸的是,当参数类型是通用的时,没有简单的方法来获得正确的重载。 您可以使用LINQ手动执行此操作:

 typeof(Enumerable) .GetMethods(BindingFlags.Public | BindingFlags.Static) .First(x => x.Name == "FirstOrDefault" && x.GetParameters().Length == 1 && x.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable<>)); 

在这种情况下,由于FirstOrDefault只有一个带有一个参数的重载,你可以删除最后一个条件。但是当有重载需要相同数量的不同类型的参数时,这是必要的。