C# 属性可以向方法添加参数吗?

Can a C# attribute add a parameter to a method?

我发现 this question - 这与我正在尝试的非常相似。但是,我的用例有点不同。

我们需要存储业务服务的审计历史记录。但是,我们需要能够在方法调用期间手动调用审计检查点,而不仅仅是之前和之后。

我们在项目中使用 Castle.Core。为此,我计划创建一个名为 AuditContext 的自定义属性,用于我们的服务方法(审计业务逻辑等)。我计划使用 Castle DynamicProxy 创建一个日志代理,它将创建一个新的上下文对象基于属性对象中的元数据参数。我想做的是将此对象作为方法参数注入到我的方法中,但不必在我们创建的每个服务方法上指定 AuditContext 参数。

本质上,而不是这个:

[AuditContext(someStaticMetadata)
public BusinessObject BusinessMethod (AuditContext context, ...arguments) {
    // ...some logic...
    context.checkpoint(someAuditData);
}

我希望能够做到这一点:

[AuditContext(someStaticMetadata)
public BusinessObject BusinessMethod (...arguments) { // We do not have to specify the context object for every business method...
    // ...some logic...
    context.checkpoint(someAuditData); // ...but the object is still available, as the parameter has been added by the argument.
}

或者,为了做一个更通用的例子,我想这样写:

[ProvidesParam2]
public Object myFunc (param1) { }

...并以具有此签名的函数结束:

public Object myFunc (param1, param2) { }

提炼出来的问题是 - C# 属性是否可以将参数添加到它修饰的方法中,从而在设计时有效地更改方法的签名?

谢谢!

简答:没有。在特殊情况下(如调用约定),属性实际上会修改您可以解释为签名的内容,但它们绝对不能修改参数列表。您可以使用自定义 IL 重写器实现您想要的; PostSharp 之类的东西可能会有所帮助(免责声明:我完全没有使用 PostSharp 的经验)。