2009-08-08 7 views
1

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

1

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:

  1. Le type déclarant de la propriété est-il vraiment le créateur (supposons qu'il s'agit d'une indirection)?
  2. 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)
+0

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

+0

Oooh - au moins une voix: D –

1

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.

3

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.

+0

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

+0

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. –

+0

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

Questions connexes