传递带有变量值的自定义属性作为参数

我创建了一个自定义属性类,它将检查系统安全性,并在出现安全性错误时抛出身份validationexception。

public class EntityChecker: System.Attribute { public EntityChecker(int entityId) { // doing some logic to check if the entityId is allowed to be inserted } } 

我想使用这个自定义属性作为实体添加函数的声明,我想将一个变量从函数传递给属性构造函数。 可以这样做吗?

 [EntityChecker(entityId)] public int AddNewEntity(entityId) { // logic of entity addition } 

可以这样做吗?!

否。必须在编译时解析属性中的构造函数参数。 它们旨在作为类型或方法本身的元数据,而不是每次调用或每个实例使用的内容。

根据您的描述,属性可能不是处理此问题的适当方式。 由于您希望运行每次调用时发生的额外代码,因此您将需要一种不同的技术。 例如,您可以传递委托,即:

 public int CheckedAddEntity(int entityId, Func funcToAdd) { // Perform your checking on entityId here return funcToAdd(); } 

这样你就可以通过以下方式调用:

 int result = CheckedAddEntity(entityId, AddNewEntity); 

在这种情况下,我建议您查看面向方面的编程。 这是一种不同的代码处理方式,但允许您在整个过程中重用样板逻辑(例如身份validation)。 您可能必须以不同的方式设计属性,但所有逻辑都可以放入“方面”,然后在构建项目时自动编译到代码中。

我个人使用PostSharp,虽然我知道还有其他人。 他们有免费的开发许可证; 只要您不需要高级function,它就非常经济实惠。

http://www.postsharp.net/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Authorization