Question

  

Double possible:
   Comment trouver la méthode qui a appelé la méthode actuelle méthode?

J'ai une méthode dans un objet qui est appelée à plusieurs endroits dans l'objet. Existe-t-il un moyen simple et rapide d’obtenir le nom de la méthode qui a appelé cette méthode populaire.

Pseudo Code EXEMPLE:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

Dans PopularMethod () , j'aimerais voir la valeur de Main s'il a été appelé depuis Main ... Je voudrais pour voir " ButtonClick " si PopularMethod () a été appelé à partir de ButtonClick

Je regardais le System.Reflection.MethodBase.GetCurrentMethod () , mais la méthode d'appel ne me sera pas fournie. J'ai consulté la classe StackTrace mais je n'ai pas vraiment aimé exécuter une trace de pile complète chaque fois que cette méthode est appelée.

Était-ce utile?

La solution

Je ne pense pas que cela puisse être fait sans traquer la pile. Cependant, il est assez simple de faire cela:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.

Cependant, je pense que vous devez vraiment vous arrêter et vous demander si cela est nécessaire.

Autres conseils

Dans .NET 4.5 / C # 5, la procédure est simple:

public void PopularMethod([CallerMemberName] string caller = null)
{
     // look at caller
}

Le compilateur ajoute automatiquement le nom de l'appelant. alors:

void Foo() {
    PopularMethod();
}

transmettra "Foo" .

C’est vraiment très simple.

public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod(); // as MethodBase
}

Mais soyez prudent, je suis un peu sceptique quant à l’incorporation de la méthode en ligne. Vous pouvez le faire pour vous assurer que le compilateur JIT ne vous gênera pas.

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod();
}

Pour obtenir la méthode d'appel:

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    // 1 == skip frames, false = no file info
    var callingMethod = new System.Diagnostics.StackTrace(1, false)
         .GetFrame(0).GetMethod();
}

Il suffit de passer un paramètre

public void PopularMethod(object sender)
{

}

IMO: Si cela suffit pour les événements, cela devrait suffire.

Je me suis souvent trouvé désireux de faire cela, mais je finis toujours par refactoriser la conception de mon système pour que je ne reçoive pas ce "Tail wagging the dog". anti-motif. Le résultat a toujours été une architecture plus robuste.

Bien que vous puissiez très certainement tracer la pile et la comprendre de cette façon, je vous exhorte à repenser votre conception. Si votre méthode a besoin de connaître une sorte d '"état", je dirais qu'il suffit de créer une énumération ou quelque chose du genre, et de la définir comme paramètre de PopularMethod (). Quelque chose dans ce sens. Sur la base de ce que vous publiez, traquer la pile constituerait une surcharge d’OMI.

Je pense que vous devez utiliser la classe StackTrace , puis StackFrame.GetMethod () sur l'image suivante.

Cela semble étrange d'utiliser Reflection pour. Si vous définissez PopularMethod , vous ne pouvez pas définir un paramètre ou un élément permettant de transmettre les informations que vous souhaitez réellement. (Ou mis sur une classe de base ou quelque chose comme ça ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top