2009-10-06 8 views

Répondre

8

Absolument - mais vous voulez une signature de la méthode comme ceci:

public static string GetMethodName<T>(Expression<Action<T>> action) 

(Cela signifie que vous devrez spécifier l'argument de type lorsque vous l'appelez, afin d'utiliser une expression lambda)

Exemple de code:.

using System; 
using System.Linq.Expressions; 

class Test 
{ 
    void Foo() 
    { 
    } 

    static void Main() 
    { 
     string method = GetMethodName<Test>(x => x.Foo()); 
     Console.WriteLine(method); 
    } 

    static string GetMethodName<T>(Expression<Action<T>> action) 
    { 
     MethodCallExpression methodCall = action.Body as MethodCallExpression; 
     if (methodCall == null) 
     { 
      throw new ArgumentException("Only method calls are supported"); 
     } 
     return methodCall.Method.Name; 
    } 
} 
+0

Que diriez-vous d'obtenir un nom de méthode d'un type spécifié? c'est-à-dire Expression >>? – Shimmy

+0

@Shimmy: Ce n'est pas vraiment clair ce que vous voulez dire, pour être honnête. Cela pourrait valoir une nouvelle question? –

+0

Je veux cette fonction: static MethodInfo GetMethod (expression >> méthode) ', [ici] (http://rextester.com/XUQI41513) est ce que j'ai essayé jusqu'à présent, mais il renvoie la méthode 'Delegate.CreateDelegate'. – Shimmy

1

vous ne ed quelque chose comme cette méthode:

public static string GetMethodName<T>(Expression<Action<T>> expression) { 
    if (expression.NodeType != ExpressionType.Lambda || expression.Body.NodeType != ExpressionType.Call) 
     return null; 
    MethodCallExpression methodCallExp = (MethodCallExpression) expression.Body; 
    return methodCallExp.Method.Name; 
} 

Appel comme ceci: GetMethodName<string>(s => s.ToLower()) retournera "ToLower".