7
votes

Déterminez quelle classe a appelé une méthode?

J'ai une application à l'esprit, mais je ne sais pas comment faire cela. Disons que j'ai une méthode accessible publiquement dans un fichier DLL qui ne prend aucun paramètre. Est-il possible pour cette méthode de savoir ce qu'on appelle? Peut-il dire s'il a été appelé à partir d'un contexte statique ou instancié? D'une classe spécifique? Qu'est-ce qu'une méthode peut savoir comment on l'appelle?


4 commentaires

Cela peut (C # 5.0 a rendu cela beaucoup plus facile), mais c'est plutôt mauvais pour le faire pour le faire en dehors des cadres forestiers. Êtes-vous sûr que vous vraiment avez-vous besoin de faire cela?


Comment dynamique cela faut-il être? Un attribut sur la méthode par exemple pourrait enregistrer les appels à la méthode que je crois ... imaginez comment fonctionne le mot clé obsolète.


Je pensais à la possibilité d'une classe de s'inscrire à une autre classe d'une manière qui ne pouvait pas être spoofée.


duplicailler possible de Comment puis-je trouver la méthode qui appelé la méthode actuelle?


3 Réponses :


7
votes

Vous pouvez obtenir des informations de l'appelant à partir d'une trace de pile: xxx pré>

Il est possible pour cette méthode de savoir ce qu'on l'appelait: p> xxx pré>

Il peut dire s'il a été appelé à partir d'un contexte statique ou instancié: p> xxx pré>

à partir d'une classe spécifique: p>

bool isGeneric = methodBase.DeclaringType.IsGenericType;


1 commentaires

Cette méthode peut casser si elle est compilée avec optimisation, car la méthode d'appel peut être inlinée.



2
votes

Si votre programme dispose de privilèges suffisants, il peut construire un < Code> StackTrace et examinez-le Cadre-Cadre pour déterminer qui est l'appelant. Cela vous obtiendra la méthode d'appel, la classe d'appel, etc.


1 commentaires

Quels privilèges faut-il?



4
votes

Vous pouvez simplement faire cela:

var callingClass = new StackFrame(1).GetMethod().ReflectedType;


0 commentaires