2009-04-10 11 views
13

que tienen un simple atributo de registro PostSharp:¿Cómo agrego argumentos a los atributos de PostSharp?

[Serializable] 
public class MethodLoggingAttribute : OnMethodBoundaryAspect 
{ 
    private ILog _logger; 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString()); 
     _logger.DebugFormat("Entered {0}", eventArgs.Method.Name); 
    } 
} 

Quiero hacer este atributo más flexible mediante la adición de información sobre los métodos de argumentos a la entrada del registro, pero sólo si su necesaria.

[Serializable] 
public class MethodLoggingAttribute : OnMethodBoundaryAspect 
{ 
    private ILog _logger; 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString()); 

     // if ShowParameters = true 
     _logger.DebugFormat("Entered {0} with args:{1}", eventArgs.Method.Name, args); 
     // else 
     _logger.DebugFormat("Entered {0}", eventArgs.Method.Name); 
     // endif 
    } 
} 

El pseudo código con el IF es lo que no estoy seguro de cómo hacer. ¿Cómo puedo pasar esto al atributo? Estoy esperando a ser algo como esto, pero yo no sé cómo manejarlo en el código de atributo:

[MethodLogging(ShowParameters=true)] 
public void SomeCrazyMethod(int CustomerId, string SecretName) {...} 

Respuesta

20

Sólo declarar una propiedad

 
[Serializable] 
public class MethodLoggingAttribute : OnMethodBoundaryAspect 
{ 
    private ILog _logger; 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString()); 
     if(ShowParameters = true) 
     { 
      _logger.DebugFormat("Entered {0} with args:{1}", eventArgs.Method.Name, args); 
     } 
     else 
     { 
      _logger.DebugFormat("Entered {0}", eventArgs.Method.Name); 
     } 
    } 

    private bool m_ShowParameters; 

    public bool ShowParameters 
    { 
     get { return m_ShowParameters; } 
     set { m_ShowParameters = value; } 
    } 
} 

A continuación, puede especificarlo en la forma en que ha mencionado.

+0

Gran respuesta. ¿Hay alguna manera de acceder y establecer esa propiedad dentro del método donde se aplica el atributo? –

+1

Desafortunadamente, no todas las propiedades de atributos deben establecerse y estar disponibles en tiempo de compilación para que no pueda establecerlas en tiempo de ejecución. –

Cuestiones relacionadas