2016-03-25 23 views
2

我发现this question - 这与我所尝试的非常相似。但是,我的用例有点不同。C#属性可以为方法添加参数吗?

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

我们在我们的项目中使用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#属性可以为它所修饰的方法添加一个参数,在设计时有效地改变方法的签名?

谢谢!

+0

我在你问的问题和你链接的问题的答案之间唯一的区别是,AuditContext需要一些静态元数据,而链接问题中的答案需要一个接口。无论哪种方式,你必须使用反射来实例化一个对象。除非你能向我解释你所要求的与所链接的问题不同,否则我倾向于投票结束重复。 –

+0

@JimMischel他在做什么和我在做什么之间的主要区别是我试图使用属性来更改方法的方法签名。事实上,我只是提出这个问题来表明它不是重复的。我的用例与他有关,但基本问题不同。查看我提供的代码示例。 –

+0

只有在不传递参数的情况下才能获得'someAuditData'的唯一方法是使用反射来定位AuditContext属性,然后使用Activator.CreateInstance来实例化它,就像链接问题的答案一样说。您不能像访问参数那样访问它。 –

回答

2

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

相关问题