web-dev-qa-db-fra.com

Comment puis-je obtenir le nom et le type de la méthode d'appel à l'aide de la réflexion?

Duplicate possible:
Comment puis-je trouver la méthode qui a appelé la méthode actuelle?

J'aimerais écrire une méthode qui obtient le nom de la méthode d'appel et le nom de la classe contenant la méthode d'appel.

Est-ce possible avec la réflexion C #?

154
Billy ONeal
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 celle-ci:

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

le nom sera "Call" et le type sera "Caller"

UPDATE Deux ans plus tard, je reçois toujours des votes positifs à ce sujet

Dans .Net 4.5, il existe maintenant un moyen beaucoup plus simple de le faire. Vous pouvez profiter de CallerMemberNameAttribute

Aller avec l'exemple précédent:

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

Vous pouvez l'utiliser en utilisant StackTrace et vous pouvez ensuite obtenir des types réfléchissants à partir de cela.

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);
21
Aren

C'est en fait quelque chose qui peut être fait en combinant les données actuelles de trace de pile et la réflexion.

public void MyMethod()
{
     StackTrace stackTrace = new System.Diagnostics.StackTrace();
     StackFrame frame = stackTrace.GetFrames()[1];
     MethodInfo method = frame.GetMethod();
     string methodName = method.Name;
     Type methodsClass = method.DeclaringType;
}

Le 1 index sur le tableau StackFrame vous donnera la méthode appelée MyMethod

11
ckramer

Techniquement, vous pouvez utiliser StackTrace, mais ceci est très lent et ne vous donnera pas les réponses que vous attendez beaucoup de temps. En effet, lors de la création de versions, des optimisations peuvent être effectuées pour supprimer certains appels de méthodes. Par conséquent, vous ne pouvez pas être sûr dans la version si stacktrace est "correct" ou non.

En réalité, il n'y a pas de moyen infaillible ou rapide de faire cela en C #. Vous devriez vraiment vous demander pourquoi vous en avez besoin et comment vous pouvez architecturer votre application afin de pouvoir faire ce que vous voulez sans savoir quelle méthode l'a appelée.

7
Bishnu

Oui, en principe, c'est possible, mais ce n'est pas gratuit.

Vous devez créer un StackTrace , puis vous pouvez jeter un coup d'œil au StackFrame's de la pile d'appels.

7
Lucero