2009-10-19 5 views
4

Je voudrais avoir une fonction appelée GetMethodName de telle sorte que le code suivant imprimerait « myMethod »:fonction pour obtenir le nom de n'importe quelle méthode?

int myMethod(string foo, double bar) 
{ 
    // ... 
} 

Console.Out.WriteLine(GetMethodName(myMethod)); 

Cela devrait fonctionner quelle que soit la méthode signature myMethod a. Est-ce possible?

Répondre

2

Qu'en est-ce?

public static string GetMethodName(Expression<Action> exp) 
{ 
    var b = (MethodCallExpression)exp.Body; 
    return b.Method.Name; 
} 

// ... 


var name = GetMethodName(() => myMethod(string.Empty, 0.0)); 
System.Out.WriteLine(name); 
-1

Quelque chose comme ci-dessous? .

nouvelle StackFrame (1, false) .GetMethod() Nom

: Modifier pour ajouter exemple de code ...

public string PrintMethodName() 
    { 
     return new StackFrame(1, false).GetMethod().Name; 
    } 

    private void Hi() 
    { 
     Console.WriteLine(PrintMethodName()); 
    } 
+0

Voir mon commentaire sur Mircea. –

-1

EDIT: Misunderstood la question. Cela aide réellement à lire la question.

Vous pouvez utiliser la réflexion:

MethodBase.GetCurrentMethod retourne la méthode de fonctionnement en cours.

+0

Rien n'indique que c'est la méthode actuelle. C'est juste une méthode aléatoire dont il veut obtenir le nom. –

+0

@Jon Ah, vous avez raison. J'ai mal compris ce qu'il voulait dire. –

+1

Ce fut ma première supposition aussi - je pris l'initiative inhabituelle de lire la question;) (je l'ai fait * si * beaucoup de fois moi-même ...) –

11

Non, ce n'est pas possible comme ça. Il serait possible avec le mythical infoof operator que l'équipe C# inclue comme à inclure, mais ne l'a pas encore fait - mais sans cela, vous devrez utiliser une conversion de groupe de méthodes, qui ne fonctionnera que si vous connaissez le type spécifique de délégué à utiliser.

Le plus proche, vous pouvez probablement venir est d'utiliser un arbre d'expression:

public static string GetMethodName(Expression expression) 
{ 
    // Code to take apart the expression tree and find the method invocation 
} 

GetMethodName(() => myMethod(0, 0)); 

Ce ne serait pas réellement besoin de appelmyMethod, mais vous devez fournir des arguments factices - qui pourrait être irritant si il y a des paramètres out/ref.

-2

Oui c'est faisable. Regardez la classe StackFrame et son GetMethod.

EDIT: il semble que j'ai mal compris la question initiale. Peu importe ma réponse originale.

+0

Voir ma réponse à Mircea. Il n'y a rien dans la question pour suggérer que le PO souhaite obtenir la méthode * current *. –

5

Comme indiqué sur le blog Eric Lippert's vous pourriez faux avec les délégués d'action et Func

public static MethodInfo GetInfo<T>(Action<T> action) 
{ 
    return action.Method; 
} 
public static MethodInfo GetInfo<T, TResult>(Func<T, TResult> func) 
{ 
    return func.Method; 
} 
public static MethodInfo GetInfo<T, U, TResult>(Func<T, U, TResult> func) 
{ 
    return func.Method; 
} 
public static int Target(int v1, int v2) 
{ 
    return v1^v2; 
} 
static int Main(string[] args) 
{ 
    var mi = GetInfo<string[], int>(Main); 
    Console.WriteLine(mi.Name); 

    var mi2 = GetInfo<int, int, int>(Target); 
    Console.WriteLine(mi2.Name); 
    return 0; 
} 
+1

Vous auriez besoin des variantes pour trente-six différents paramètres si -. Y compris des combinaisons de ref/comme bien :( –

+0

vrai ... mais il est possible que j'avais un échantillon qui était jusqu'à 4 entrées (compter sur Func et Action), mais Je pensais que le code était trop pour un échantillon rapide. –

+0

comment peut-GetInfo distinguer entre une méthode vide prenant 2 arguments int d'une part et une méthode int prenant 1 argument int sur l'autre? – JoelFan

Questions connexes