如何获取通用扩展方法的MethodInfo?

问题描述 投票:0回答:2

我有一个

IEnumerable<T>
,我想通过反射调用
Enumerable.Contains
方法。 我只是努力让语法正确。 这是我目前拥有的:

var containsMethod = typeof(Enumerable).GetMethod("Contains", 
  new[] {
    typeof(IEnumerable<T>), 
    typeof(T) 
  });

这只是返回一个空值。

获得

MethodInfo
的正确方法是什么?

c# linq generics reflection extension-methods
2个回答
19
投票

获取MethodInfo的正确方法是什么?

你必须找到generic方法——不幸的是这有点痛苦——然后用适当的参数构造它。在这种情况下,您知道只有 2 个

Contains
重载,而您想要的重载有两个参数,因此您可以使用:

var method = typeof(Enumerable).GetMethods()
                               .Where(m => m.Name == "Contains")
                               .Single(m => m.GetParameters().Length == 2)
                               .MakeGenericMethod(typeof(T));

然后您应该能够适当地调用它。


0
投票

受到如何获取“Where”扩展方法的正确MethodInfo的答案的启发。

((Func<IEnumerable<string>, string, bool>)Enumerable.Contains).Method.GetGenericMethodDefinition()

© www.soinside.com 2019 - 2024. All rights reserved.