2011-01-16 3 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

Ce code renverra une chaîne obscure comme suit: <Main>b__0.L'utilisation de MethodInfo.GetCurrentMethod() dans les méthodes anonymes

Existe-t-il un moyen d'ignorer les méthodes anonymes et d'obtenir un nom de méthode plus lisible?

+6

Et quel nom voulez-vous que pour une méthode de _anonymous_ ?? –

+0

Je ne tiens aucune rancune pour MS anon. générateur de nom de méthode. Je me demandais juste s'il y avait un moyen de creuser dans la trace de pile pour la méthode non anonyme la plus proche? Est-il possible de savoir qu'une instance MethodInfo est anonyme? – HuBeZa

Répondre

6

Vous pouvez capturer l'extérieur :

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

Autre que cela; non.

+0

Oui. Je pense que les variables capturées sont la solution la meilleure et la plus simple. – HuBeZa

6

Non, il n'y en a pas. C'est pourquoi c'est une méthode anonyme. Le nom est automatiquement généré par le compilateur et garanti d'être unique. Si vous souhaitez obtenir le nom de la méthode d'appel que vous pourriez le transmettre comme argument:

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

ou si vous voulez vraiment un nom significatif, vous devrez fournir:

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

Malheureusement, je ne peux pas passer de paramètres parce que c'est une API tierce, et je ne veux pas l'emballer juste pour ça. Y a-t-il un moyen de creuser dans la trace de la pile? Est-il possible de savoir qu'une instance de 'MethodInfo' est anonyme? – HuBeZa

+2

@HuBeZa, vous pouvez tester si MethodInfo est décoré avec l'attribut '[CompilerGenerated]'. C'est une condition requise et une bonne candudate pour être une méthode anonyme mais évidemment pas une condition suffisante: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), true);' –

3

Si vous recherchez le nom de la fonction dans laquelle se trouve la méthode anonyme, vous pouvez parcourir la pile et obtenir le nom de la méthode d'appel. Notez cependant que cela ne fonctionnerait que tant que le nom de votre méthode désirée serait dans la hiérarchie. Il existe peut-être un moyen de voyager jusqu'à ce que vous atteigniez une méthode non anonyme.

Pour plus d'informations, voir: http://www.csharp-examples.net/reflection-calling-method-name/

Questions connexes