2008-11-28 8 views
1

J'essaie d'obtenir un objet MethodInfo pour la méthode:Comment obtenir MethodInfo d'une méthode générique?

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

Le problème que je vais avoir travaille comment vous spécifiez le paramètre de type pour le bit Func<TSource, Boolean> ...

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

Aide appréciée.

+0

double possible de [obtenir une méthode générique sans utiliser GetMethods] (http://stackoverflow.com/questions/269578/get-a-generic-method-without-using-getmethods) – nawfal

Répondre

2

Il n'y a aucun moyen de l'obtenir en un seul appel, car vous auriez besoin de faire un type générique construit avec le paramètre générique de la méthode (TSource dans ce cas). Et comme c'est spécifique à la méthode, vous devez obtenir la méthode pour l'obtenir et construire le type Func générique. Problème de poulet et d'œuf heh? Cependant, vous pouvez faire en sorte que toutes les méthodes Any soient définies sur Enumerable, et parcourir celles-ci pour obtenir celle que vous voulez.

3

Vous pouvez créer une méthode d'extension qui récupère toutes les méthodes et les filtre afin de renvoyer la méthode générique souhaitée.

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

Utilisation de la méthode d'extension ci-dessus, vous pouvez écrire un code similaire à ce que vous aviez l'intention:

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