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? P>
3 Réponses :
Vous pouvez obtenir des informations de l'appelant à partir d'une trace de pile: Il est possible pour cette méthode de savoir ce qu'on l'appelait: p> Il peut dire s'il a été appelé à partir d'un contexte statique ou instancié: p> à partir d'une classe spécifique: p> bool isGeneric = methodBase.DeclaringType.IsGenericType;
Cette méthode peut casser si elle est compilée avec optimisation, car la méthode d'appel peut être inlinée.
Si votre programme dispose de privilèges suffisants, il peut construire un < Code> StackTrace CODE> 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. p>
Quels privilèges faut-il?
Vous pouvez simplement faire cela:
var callingClass = new StackFrame(1).GetMethod().ReflectedType;
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 i> 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?