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 #?
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
}
}
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);
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
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.
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.