1

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

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

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

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

帮助表示赞赏。

4

2 回答 2

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;
    }
}

Using the extension method above, you can write code similar to what you had intended:

MethodInfo method = typeof(Enumerable).GetGenericMethod("Any", new[] { typeof(IEnumerable<>), typeof(Func<,>) });
于 2010-10-27T18:02:14.873 回答
2

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

但是,您可以做的是获取在 Enumerable 上定义的所有 Any 方法,并遍历这些方法以获得您想要的方法。

于 2008-11-28T16:19:00.110 回答