2009-04-10 3 views
13

У меня есть простой атрибут PostSharp протоколирования:Как добавить аргументы в атрибуты 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); 
    } 
} 

Я хочу, чтобы сделать этот атрибут более гибким путем добавления информации о методах аргументы записи журнала, но только если его необходимо.

[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 
    } 
} 

Псевдокод с IF - это то, что я не уверен, как это сделать. Как я могу передать это в атрибут? Я ожидаю, чтобы она выглядела примерно так, но я не знаю, как справиться с этим в коде атрибута:

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

ответ

20

Просто объявить свойство

 
[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; } 
    } 
} 

Затем вы можете указать его в том, как вы упомянув.

+0

Отличный ответ. Есть ли способ получить доступ и установить это свойство внутри метода, в котором применяется атрибут? –

+1

К сожалению, не все свойства атрибутов должны быть установлены и доступны во время компиляции, поэтому вы не можете установить их во время выполнения. –