2008-11-28 53 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

可能重複http://stackoverflow.com /問題/ 269578/GET-A-仿製方法,而無需-使用-的getMethods) – nawfal 2013-10-08 10:58:47

回答

2

無法在一次調用中獲得它,因爲您需要製作一個泛型類型,該類型由方法的通用參數(本例中爲TSource)構造而成。並且,由於它特定於該方法,您需要獲取該方法並構建通用Func類型。雞和雞蛋問題?

你可以做的是獲得Enumerable上定義的所有Any方法,然後遍歷這些方法來獲得你想要的。

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<,>) }); 
的[獲取泛型方法不使用的getMethods(
相關問題