我找到了this question - 这与我正在尝试的非常相似。但是,我的用例有点不同。
我们需要存储业务服务的审核历史记录。然而,我们需要能够在方法调用期间手动调用审计检查点,而不仅仅是在方法调用之前和之后。
我们在项目中使用 CaSTLe.Core。为了实现这一点,我计划创建一个名为 AuditContext
的自定义属性,用于我们的服务方法(审核业务逻辑等)。我计划使用 CaSTLe DynamicProxy 创建一个日志记录代理,该代理将创建一个基于属性对象中的元数据参数的新上下文对象。我想要做的是将此对象作为方法参数注入(inject)到我的方法中,但不必在我们创建的每个服务方法上指定 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 的经验)。
关于c# - C# 属性可以向方法添加参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36221930/