如何获得泛型方法的MethodInfo?

时间:2008-11-28 16:12:45

标签: c# .net reflection extension-methods

我正在尝试为该方法获取MethodInfo个对象:

Any<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

我遇到的问题是如何指定Func<TSource, Boolean>位的类型参数......

MethodInfo method = typeof(Enumerable).GetMethod("Any", new[] { typeof(Func<what goes here?, Boolean>) });

帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

您可以创建一个扩展方法来执行检索所有方法并过滤它们的工作,以便返回所需的泛型方法。

public static class TypeExtensions
{
    private class SimpleTypeComparer : IEqualityComparer<Type>
    {
        public bool Equals(Type x, Type y)
        {
            return x.Assembly == y.Assembly &&
                x.Namespace == y.Namespace &&
                x.Name == y.Name;
        }

        public int GetHashCode(Type obj)
        {
            throw new NotImplementedException();
        }
    }

    public static MethodInfo GetGenericMethod(this Type type, string name, Type[] parameterTypes)
    {
        var methods = type.GetMethods();
        foreach (var method in methods.Where(m => m.Name == name))
        {
            var methodParameterTypes = method.GetParameters().Select(p => p.ParameterType).ToArray();

            if (methodParameterTypes.SequenceEqual(parameterTypes, new SimpleTypeComparer()))
            {
                return method;
            }
        }

        return null;
    }
}

使用上面的扩展方法,您可以编写类似于您预期的代码:

MethodInfo method = typeof(Enumerable).GetGenericMethod("Any", new[] { typeof(IEnumerable<>), typeof(Func<,>) });

答案 1 :(得分:2)

没有办法在单个调用中获取它,因为您需要创建一个由该方法的泛型参数(在本例中为TSource)构造的泛型类型。并且因为它特定于该方法,您需要获取方法来获取它并构建通用Func类型。鸡肉和鸡蛋问题嘿?

你可以做的是获得在Enumerable上定义的所有Any方法,并迭代它们以获得你想要的那个。