【问题标题】:How do I add arguments to PostSharp attributes?如何向 PostSharp 属性添加参数?
【发布时间】:2025-12-25 21:05:11
【问题描述】:

我有一个简单的 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) {...}

【问题讨论】:

    标签: c# postsharp


    【解决方案1】:

    只需声明一个属性

    [可序列化] 公共类 MethodLoggingAttribute : OnMethodBoundaryAspect { 私人 ILog _logger; 公共覆盖无效 OnEntry(MethodExecutionEventArgs eventArgs) { _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString()); 如果(显示参数 = 真) { _logger.DebugFormat("输入的 {0} 带有 args:{1}", eventArgs.Method.Name, args); } 别的 { _logger.DebugFormat("输入 {0}", eventArgs.Method.Name); } } 私人布尔 m_ShowParameters; 公共布尔显示参数 { 得到 { 返回 m_ShowParameters; } 设置 { m_ShowParameters = 值; } } }

    那你就可以按照你提到的方式指定了。

    【讨论】:

    • 很好的答案。有没有办法在应用属性的方法中访问和设置该属性?
    • 不幸的是,并非所有 Attributes 属性都必须在编译时设置并可用,因此您无法在运行时设置它们。