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

标签 c# aop custom-attributes castle-dynamicproxy

我找到了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/

相关文章:

java - Aspectj 切入点表达式不适用于单个类中的一种方法,但适用于另一种方法

java - Spring AOP 不拦截 Spring 容器内的方法

c# - 使用 AutoMapper 时如何跳过自定义验证属性?

c# - 从 List<Point> 中获取 3 个最常见的点

c# - 在具有接口(interface)的 LINQ to Sql 数据上下文上使用删除 - 'Interface is not mapped as a table'

c# - 连接 SQL 查询中一个字段的多个结果

c# - 更新数据库中网页的查看次数

java - 为什么没有为 Jersey Controller 检测到我的方面(使用自定义注释)?

matlab - Matlab 中可以出现哪些方法关键字(即 TestMethodSetup)?

c# - C# dotnet core 中同一属性的多个方法的自定义属性声明