2014-06-24 2 views
-1

Comment obtenir le class-name avec caller info attributes.Obtenir le nom de classe

I strongly say a no pour consigner le nom de la classe en utilisant la réflexion.

a été en mesure d'obtenir le nom de la méthode en utilisant la [CallerMemberName] comme ci-dessous:

 private void Log(string logMessage, [CallerMemberName]string callerName = null) 
     { 
      if (logger.IsDebugEnabled) 
      { 
       logger.DebugFormat("Executing Method = {1};{0}", logMessage, callerName); 
      } 
     } 

Comment enregistrer les class name ici en utilisant appelant info Caractéristiques?

Répondre

3

Vous ne pouvez pas aucun attribut disponible qui fait cela. Cependant, étant donné que Log est privé, aucune classe externe ne peut appeler la fonction, donc vous savez déjà quelle classe l'a appelée.

public SomeClass 
{ 

    //(snip) 

    private void Log(string logMessage, [CallerMemberName]string callerName = null) 
    { 

     if (logger.IsDebugEnabled) 
     { 
      string className = typeof(SomeClass).Name; 

      logger.DebugFormat("Executing Method = {1};{2}.{0}", logMessage, callerName, className); 
     } 
    } 
} 
5

Tout d'abord, la méthode est privée de sorte que la classe actuelle serait l'utiliser, dans ce cas, cela peut être trouvé en utilisant la propriété typeof(T).FullName ou typeof(T).Name.

Ce que vous pouvez également essayer ici est de trouver le nom de la classe du cadre de pile programatically qui fonctionne pour les autres classes si la méthode était publique, comme indiqué ci-dessous:

private void Log(string logMessage) 
{ 
    StackFrame frame = new StackFrame(1, false); 
    MethodBase method = frame.GetMethod(); 
    Type declaringType = method.DeclaringType; 

    // Log declaringType.FullName or other property 
} 

Vous pouvez trouver plus d'informations sur la StackFrame here et la MethodBase here

l'autre façon, vous pouvez le faire est d'avoir un paramètre de type sur la méthode pour vous connecter et passer le type que vous voulez être connecté, mais la méthode devrait être publique s'il doit être appelé depuis l'extérieur de cette classe:

public void Log(string logMessage, Type classType) 
{ 
    // Log message and class name 
} 

Espérons que cela aide.

+0

'StackFrame' n'est pas fiable lorsque vous utilisez des versions de version sans un débogueur attaché. Des choses comme la méthode en ligne peuvent faire croire que le code existe ailleurs que là où vous pensez qu'il existe. –

+0

C'est vrai, il faudrait le paramétrer sur NoInlining pour qu'il soit fiable. J'ai oublié ce point - merci. –

Questions connexes