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

时间:2016-03-25 14:32:52

标签: c# aop custom-attributes castle-dynamicproxy

我找到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#属性可以为它装饰的方法添加一个参数,在设计时有效地改变方法的签名吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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