2010-11-30 20 views
1

Ive a obtenu une méthode d'enregistrement:Comment utiliser la réflexion dans une méthode statique

public static void WriteSimpleDebugTrace(string logFilePathArg, string messageArg) 
    { 

     StreamWriter writer; 

     //Environment.ExpandEnvironmentVariables("%SystemDrive%") [will get to the c drive] 
     if (EnumsAndConstants.EnableApplicationLogging) 
     { 
      writer = new StreamWriter(logFilePathArg, true); 
      writer.Write("Time: " + DateTime.Now.ToString() + " Message: " + messageArg); 
      writer.Write(Environment.NewLine); 
      writer.Flush(); 
      writer.Close(); 
     } 

    } 

Et je suis en train d'accéder au nom this.GetType() à l'intérieur, mais je ne suis pas autorisé à.. Y a-t-il de toute façon autour de ça? Je veux obtenir facilement le nom de la classe appelante lorsque cette méthode est appelée sans avoir à réécrire tous les appels à cette méthode ...

+0

* Quel type * voulez-vous exactement? Vous pourriez faire 'typeof (DeclaringClass)'/'MethodBase.GetCurrentMethod(). DeclaringType', mais cela ne vous donnerait que le type de la classe * logger *. Si vous voulez le type de la classe qui a appelé cette méthode, vous pouvez examiner la pile d'appel, mais ceci est lourd de problèmes (possible JIT inlining etc). – Ani

Répondre

0

Comme c'est statique, il n'y a pas d'instance this. Vous passez généralement l'instance réelle à la méthode pour fournir les données de la méthode. J'ai une classe de journalisation qui accepte une instance Reflection.MethodInfo pour la sortie. Comme vous ne voulez pas changer la signature de la méthode, peut-être vous auriez plus de chance d'utiliser la classe de diagnostic STACKTRACE:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace%28VS.71%29.aspx

Préparons le cadre précédent, puis récupérer la méthode d'appel. L'exemple dit à peu près tout.

0

Vous pouvez utiliser stackTrace.GetFrame(1).GetMethod() pour récupérer la méthode d'appel et à partir de là le nom de la classe associée