Как получить MethodInfo универсального метода? - PullRequest
1 голос
/ 28 ноября 2008

Я пытаюсь получить объект 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 ]

3 голосов
/ 27 октября 2010

Вы можете создать метод расширения, который выполняет работу по извлечению всех методов и их фильтрации для возврата к требуемому универсальному методу.

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<,>) });
2 голосов
/ 28 ноября 2008

Нет способа получить его за один вызов, так как вам нужно будет создать универсальный тип, построенный из универсального параметра метода (в данном случае TSource). А так как он специфичен для метода, вам нужно получить метод, чтобы получить его и построить общий тип Func. Курица и яйцо, хех?

Что вы можете сделать, так это получить все методы Any, определенные в Enumerable, и перебрать их, чтобы получить тот, который вам нужен.

...