J'ai besoin d'une solution pour tracer le propriétaire d'une méthode dans laquelle l'objet est construit. Je veux dire, je veux que le constructeur résolve automatiquement l'objet Type de la classe "creator". Est-ce possible en C#?Création d'objet, comment résoudre "class-owner"?
Répondre
En supposant que inline de la méthode qui doit vérifier l'appelant et les autorisations ne sont pas un problème, vous pouvez appeler la méthode suivante dans un constructeur:
[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public static Type GetCallerType()
{
StackTrace st = new StackTrace(2);
StackFrame sf = st.GetFrame(0);
return sf.GetMethod().DeclaringType;
}
Donc, pour votre vraie question, la réponse est oui, c'est possible, mais pas recommandé.
EDIT:
La méthode nécessitera l'autorisation de réflexion pour accéder à la méthode GetMethod()
et la propriété DeclaringType
. Pour le stack trace, une autorisation de sécurité pour le code non managé est nécessaire (si je comprends bien la documentation), ce qui rend cette méthode essentiellement inutilisable pour tout ce qui est inférieur au code entièrement approuvé.
Comme vous le voyez, j'ai décoré la méthode avec un attribut qui demande explicitement au JIT de ne pas incorporer la méthode, puisqu'il marche au moins un dans la pile des appels. Des problèmes surviennent si la méthode appelante devient inline (ou quelle que soit la transformation du JIT) dans sa propre méthode d'appel. Je peux donner un échantillon avec une propriété courte, puisque les propriétés sont susceptibles d'être inline par le JIT, bien que je ne peux pas garantir que ce Corret:
public object PropertyThatGivesObject
{
get { return new ObjectThatTracksItsCreator(); }
}
Bien que ce soit assez exotique (la propriété est pas une « propriété d'un objet ', c'est une usine), ceci a au moins un problème:
- Le type déclarant de la propriété est-il vraiment le créateur (supposons qu'il s'agit d'une indirection)?
- Si la propriété getter est inline, cela aurait-il dû être le type de déclaration de la propriété qui était le créateur? (Pertinent si la méthode qui appelle la propriété est déclarée par un autre type)
Vous pouvez utiliser le StackFrame pour savoir d'où l'objet a été construit, mais il y a des limites à ce qu'il peut comprendre et quand, par exemple si vous utilisez un mode de sécurité abaissé, il a gagné ' t être capable de travailler.
Un objet n'a naturellement aucun concept de créateur.
Si vous voulez déterminer de manière fiable ce qui crée un objet, vous devrez l'exprimer explicitement dans le constructeur. L'analyse des cadres de pile n'a pas seulement des problèmes dans les environnements de faible confiance (comme l'a mentionné Lasse), mais peut être inexacte à cause de l'inline.
Quel est le plus gros problème que vous essayez de résoudre? Pourquoi la classe est-elle importante pour vous? Il pourrait y avoir une meilleure approche.
Thx pour la réponse. Je sais qu'il n'y a pas un tel concept. Ce n'est pas vraiment un gros problème, mais j'ai été intrested, si c'est possible. Voici la situation - je travaille actuellement avec un code ancien et pas le mien. Il y a un module de journalisation, où je dois toujours passer Type objet de l'appelant. Ce n'est pas vraiment nécessaire, mais utile pour l'enregistreur. Donc je voulais le résoudre par un code. – ALOR
Personnellement, je passerais le type approprié explicitement plutôt que d'utiliser la réflexion. C'est plus simple, même si c'est plus bavard. –
Finalement, moi aussi.J'ai lu un peu plus sur l'utilisation de la trace de pile, et l'ai trouvé fiable avec tout ce compilateur-JIT-stuff. – ALOR
- 1. Comment résoudre cette exception WCF?
- 2. ORA-4030 Oracle: Comment résoudre
- 3. Comment résoudre l'erreur synciwam.vbs 1B6?
- 4. Comment résoudre ce problème bad_alloc?
- 5. Comment résoudre ce problème UITextView
- 6. EMF ecore et xsd désynchronisé, comment résoudre?
- 7. NUnit CPU utilisation très élevée - Comment résoudre?
- 8. Comment résoudre ce problème avec l'extension JSP?
- 9. Comment résoudre le défilement lent dans UITableView
- 10. Comment faire pour résoudre ASP.NET MVC
- 11. Comment puis-je résoudre cette erreur PicasawebService?
- 12. comment résoudre ce type d'erreur de conversion?
- 13. Comment résoudre une erreur de liaison?
- 14. comment résoudre le problème de blocage?
- 15. Comment résoudre le problème suivant dans VC++
- 16. Comment résoudre une session fixée dans asp.net?
- 17. Comment résoudre l'hôte (seulement) en utilisant Boost.Asio?
- 18. Comment faire pour résoudre l'erreur Undefined Symbols?
- 19. Comment résoudre "La publication a échoué: Erreur lors de la création du fichier zip XXX.jar: entrée en double: .svn/entrées"
- 20. C# WinForms BindingList & DataGridView - interdisant EDIT empêche la création d'une nouvelle ligne? Comment puis-je résoudre ce problème?
- 21. Impossible de résoudre DNS
- 22. résoudre sous-domaine dans apache
- 23. Code Golf: Résoudre un labyrinthe
- 24. Création de dossiers temporaires
- 25. Comment faire pour résoudre l'application .NET qui disparaît juste?
- 26. Comment procéder pour étudier et résoudre un problème d'autorisation Mercurial?
- 27. Comment résoudre le problème "Trop de fichiers ouverts" dans Hudson?
- 28. Comment résoudre les erreurs de référence de type F #?
- 29. Comment puis-je résoudre ce problème CSS IE?
- 30. En C#, comment puis-je résoudre l'adresse IP d'un hôte?
Thx. Donc, si j'ai compris, je peux obtenir un mauvais résultat, si la méthode de l'appelant est en ligne avec une méthode de l'autre classe? Et, s'il vous plaît, pouvez-vous être plus descriptif sur le problème des autorisations? N'importe quel exemple s'il vous plaît? – ALOR
Oooh - au moins une voix: D –