Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#属性能否向方法添加参数?_C#_Aop_Custom Attributes_Castle Dynamicproxy - Fatal编程技术网

C#属性能否向方法添加参数?

C#属性能否向方法添加参数?,c#,aop,custom-attributes,castle-dynamicproxy,C#,Aop,Custom Attributes,Castle Dynamicproxy,我发现-这与我正在尝试的非常相似。然而,我的用例有点不同 我们需要存储业务服务的审核历史记录。然而,我们需要能够在方法调用期间手动调用审计检查点,而不仅仅是在方法调用前后 我们在项目中使用Castle.Core。为了实现这一点,我计划创建一个名为AuditContext的自定义属性,用于我们的服务方法(审计业务逻辑等)。我计划使用Castle DynamicProxy创建一个日志代理,该代理将基于属性对象中的元数据参数创建一个新的上下文对象。我想做的是将这个对象作为方法参数注入到我的方法中,但不

我发现-这与我正在尝试的非常相似。然而,我的用例有点不同

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

我们在项目中使用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的经验)。

我看到您所问的问题与您链接的问题的答案之间的唯一区别是,
AuditContext
采用一些静态元数据,而链接问题的答案采用接口。无论哪种方式,都必须使用反射来实例化对象。除非你能向我解释你所问的与链接的问题有什么不同,否则我倾向于投票以重复的方式结束。@JimMischel他所做的和我所做的主要区别是我试图使用一个属性来更改方法的方法签名。事实上,我提供这个问题只是为了证明它不是重复的。我的用例与his相关,但根本问题不同。请参阅我提供的代码示例。要获取
someAuditData
而不将其作为参数传递,唯一的方法是使用反射来定位
AuditContext
属性,然后使用
Activator.CreateInstance
来实例化它,正如链接问题的答案所示。您不能像访问参数一样访问它。@JimMischel如果是这样,那么我就不能在函数中访问它-对吗?我询问参数的原因,特别是因为我相信我可以使用动态代理在运行时将所需的对象传递给方法。问题是,如果不更改方法签名,我认为这是不可能的。是的,您可以。与其向属性提供静态数据,不如给它一个包含函数引用的对象。该方法使用反射来查找属性并实例化它,然后调用该方法。该方法提供审计上下文数据。