168 votes

Comment puis-je obtenir le nom de la méthode appelante et tapez à l’aide de la réflexion ?

<blockquote> <p><strong>Doublon possible :</strong><br> <a href="http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method">J’aimerai trouver la méthode ayant appelé la méthode actuelle ?</a> </p> </blockquote> <p>Je tiens à écrire une méthode qui permet d’obtenir le nom de la méthode d’appel et le nom de la classe contenant la méthode d’appel.</p> <p>Est-ce possible avec c# réflexion ?</p>

434voto

BFree Points 46421
public class SomeClass
{
    public void SomeMethod()
    {
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    }
}

Maintenant, disons que vous avez une autre classe comme ceci:

public class Caller
{
   public void Call()
   {
      SomeClass s = new SomeClass();
      s.SomeMethod();
   }
}

le nom sera "Appel" et de type "Caller"

Mise à JOUR Deux ans plus tard, car je suis encore en train upvotes sur ce

Dans .Net 4.5, il existe désormais un moyen beaucoup plus facile de le faire. Vous pouvez profiter de l' CallerMemberNameAttribute

Va avec l'exemple précédent:

public class SomeClass
{
    public void SomeMethod([CallerMemberName]string memberName = "")
    {
        Console.WriteLine(memberName); //output will me name of calling method
    }
}

21voto

Aren Points 17843

Vous pouvez l’utiliser à l’aide de la `` et ensuite vous pouvez obtenir des types réflectifs de celle.

12voto

ckramer Points 7315

C’est en fait quelque chose qui peut être fait en utilisant une combinaison des données de trace de la pile actuelle et réflexion.

Le indice sur le tableau StackFrame vous donnera la méthode qui appelle

7voto

Lucero Points 38928

Oui, en principe, il est possible, mais il ne vient pas gratuitement.

Vous devez créer un StackTrace, et puis vous pouvez jeter un oeil à de StackFrame de la pile des appels.

7voto

Bishnu Points 495

Techniquement, vous pouvez utiliser StackTrace, mais c'est très lent et ne sera pas vous donner les réponses que vous attendez beaucoup de temps. C'est parce que pendant les versions release optimisations peuvent se produire qui va supprimer certains appels de méthode. Par conséquent, vous ne pouvez pas être sûr dans la version que stacktrace est "correct" ou non.

Vraiment, il n'y a pas infaillible ou moyen rapide de le faire en C#. Vous devez vraiment vous demander pourquoi vous avez besoin et comment vous pouvez l'architecte de votre application, donc vous pouvez faire ce que vous voulez sans connaître la méthode qui l'a appelé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X