web-dev-qa-db-fra.com

Comment obtenir le nom de la méthode en cours à partir du code

Je sais que tu peux faire

this.GetType().FullName

Obtenir

My.Current.Class

Mais que puis-je appeler pour obtenir

My.Current.Class.CurrentMethod
339
Nick Allen
using System.Diagnostics;
...

var st = new StackTrace();
var sf = st.GetFrame(0);

var currentMethodName = sf.GetMethod();

Ou, si vous souhaitez avoir une méthode d'assistance:

[MethodImpl(MethodImplOptions.NoInlining)]
public string GetCurrentMethod()
{
    var st = new StackTrace();
    var sf = st.GetFrame(1);

    return sf.GetMethod().Name;
}

Mis à jour avec les crédits à @stusmith.

334
user151323

Appelez System.Reflection.MethodBase.GetCurrentMethod().Name depuis la méthode.

483
Jamie Ide

La réflexion a le don de cacher la forêt aux arbres. Vous n'avez jamais de problème à obtenir le nom de la méthode actuelle avec précision et rapidité:

void MyMethod() {
  string currentMethodName = "MyMethod";
  //etc...
}

Bien qu'un outil de refactoring ne le corrigera probablement pas automatiquement.

Si vous ne vous souciez pas du coût (considérable) de l'utilisation de Reflection, cette méthode d'assistance devrait vous être utile:

using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Reflection;
//...

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetMyMethodName() {
  var st = new StackTrace(new StackFrame(1));
  return st.GetFrame(0).GetMethod().Name;
} 

Mise à jour: C # version 5 et .NET 4.5 offrent la solution idéale à ce besoin courant. Vous pouvez utiliser l'attribut [CallerMemberName] pour que le compilateur génère automatiquement le nom de la méthode d'appel dans un argument de chaîne. . D'autres attributs utiles sont [CallerFilePath] pour que le compilateur génère le chemin du fichier de code source et [CallerLineNumber] pour obtenir le numéro de ligne dans le fichier de code source de l'instruction qui a passé l'appel.


Update2: la syntaxe que j'ai proposée en haut de la réponse peut maintenant fonctionner en C # version 6 sans un outil de refactoring sophistiqué:

string currentMethodName = nameof(MyMethod);
93
Hans Passant

Je pense que le meilleur moyen d'obtenir le nom complet est:

 this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;

ou essayez ceci

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);   
33
Zakaria

Est-ce que ça ne marche pas?

System.Reflection.MethodBase.GetCurrentMethod()

Retourne un objet MethodBase représentant la méthode en cours d'exécution.

Espace de noms: System.Reflection

Assembly: mscorlib (dans mscorlib.dll)

http://msdn.Microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx

11
Orwellophile

Vous pouvez également utiliser MethodBase.GetCurrentMethod() pour empêcher le compilateur JIT d'inclure la méthode dans laquelle elle est utilisée.


Mise à jour:

Cette méthode contient une énumération spéciale StackCrawlMark qui, de mon point de vue, précisera au compilateur JIT que la méthode actuelle ne doit pas être insérée.

Ceci est mon interprétation du commentaire associé à cette énumération présente dans SSCLI. Le commentaire suit:

// declaring a local var of this enum type and passing it by ref into a function 
// that needs to do a stack crawl will both prevent inlining of the calle and 
// pass an ESP point to stack crawl to
// 
// Declaring these in EH clauses is illegal; 
// they must declared in the main method body
9
João Angelo

Bien System.Reflection.MethodBase.GetCurrentMethod().Name n'est pas un très bon choix, car il affichera simplement le nom de la méthode sans informations supplémentaires.

Comme pour string MyMethod(string str), la propriété ci-dessus ne renverra que MyMethod, ce qui n’est guère adéquat.

Il vaut mieux utiliser System.Reflection.MethodBase.GetCurrentMethod().ToString() qui retournera la signature de la méthode complète ...

5
Arefin
3
Brian Mains