2009-08-07 3 views
3

Je voudrais utiliser la réflexion dans .NET pour accéder à l'objet qui a appelé ma méthode. Je suppose qu'il est en quelque sorte possible de voir la pile. Je sais que ce n'est pas sûr pour une variété de raisons, mais j'ai juste besoin de saisir et de cataloguer certaines valeurs de propriété.Utiliser la réflexion C# pour accéder à l'objet jusqu'à la pile

Comment faire?

Mise à jour: Je suis un idiot, j'ai oublié de dire que c'était en C#

+1

http://stackoverflow.com/a/10530629/8155 –

Répondre

2

si une méthode statique vous appelle?

Ne serait-ce pas un meilleur contrat (plus simple) avec l'appelant s'il s'est transmis à vous?

+0

Bien sûr, mais je n'ai pas le contrôle de la bibliothèque d'appel. Je suis en train d'écrire un plugin Launching de l'histoire de la commande et leur modèle de plugin manque quelque peu de flexibilité. Je sais qui va faire l'appel, j'ai juste besoin d'un moyen d'y accéder –

2

Vous pouvez utiliser les StackTrace & classes StackFrame

Voici un exemple de MSDN

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

Ceci est un exemple qui devrait imprimer "Main"

class Program 
{ 
    static void Main(string[] args){ 
     Func(); 
    } 
    static void Func(){ 
     StackFrame frame = new StackFrame(1); 
     StackTrace trace = new StackTrace(frame); 
     var method = frame.GetMethod(); 
     Console.WriteLine(method.Name); 
    } 
} 
+0

Super info, je ne le savais pas. Mais j'ai vraiment besoin d'informations sur l'instance qui a invoqué ma méthode. –

+0

Vous devez utiliser le constructeur d'objet StackFrame et lui transmettre un nombre entier de combien de niveaux vous voulez être dans la pile d'appels. par exemple StackFrame (1) nouveau signifie l'appelant StackFrame (2) l'appelant de l'appelant – bashmohandes

5
var methodInfo = new StackFrame(1).GetMethod(); 

Renvoie la méthode appelée ed la méthode actuelle.

Notez que le compilateur peut intégrer ou optimiser les appels aux méthodes (bien que cela puisse ne pas être le cas pour vous), ce qui contrecarre le comportement attendu. Pour être sûr, décorez votre méthode avec:

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] 

Notez que cela va à l'encontre du fait que le compilateur fasse son travail. Caveat emptor.

ÉDITÉE Oups, je vois que vous voulez que le exemple qui a invoqué votre méthode. Il n'y a aucun moyen d'obtenir cette information.

+0

Merci pour la réponse. Toutes les informations accessibles au débogueur VS ne devraient-elles pas théoriquement m'être accessibles? Le débogueur peut rechercher les cadres de pile à l'instance qui a appelé une méthode ... –

+0

Vous devrez probablement attacher au processus en tant que débogueur pour obtenir ce niveau de détail. Voir http://stackoverflow.com/questions/420541/is-there-any-way-to-get-a-reference-to-the-calling-object-in-c –

Questions connexes