2008-11-28 3 views
1

Я пытаюсь получить MethodInfo объект для метода:Как получить MethodInfo общего метода?

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

Проблема у меня работает, как вы задаете параметр типа для Func<TSource, Boolean> бит ...

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

Помогите оценить.

+0

возможно дубликат [Получить универсальный метод без использования GetMethods] (http://stackoverflow.com/вопросы/269578/наймите-родовой-метод-без использования-GetMethods) – nawfal 2013-10-08 10:58:47

ответ

2

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

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

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<,>) }); 
Смежные вопросы