我创建了一个自定义属性类,它将检查系统安全性,并在出现安全性错误时抛出身份验证异常。
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
}
答案 0 :(得分:12)
可以这样做吗?!
没有。必须在编译时解析属性中的构造函数参数。它们旨在作为类型或方法本身的元数据,而不是每次调用或每个实例使用的内容。
根据您的描述,属性可能不是处理此问题的适当方式。由于您希望运行每次调用时发生的额外代码,因此您将需要一种不同的技术。例如,您可以传递委托,即:
public int CheckedAddEntity(int entityId, Func<int, int> funcToAdd)
{
// Perform your checking on entityId here
return funcToAdd();
}
这会让你通过以下方式打电话:
int result = CheckedAddEntity(entityId, AddNewEntity);
答案 1 :(得分:1)
在这种情况下,我建议您查看面向方面的编程。这是一种不同的代码处理方式,但它允许您在整个过程中重用样板逻辑(例如身份验证)。您可能必须以不同的方式设计属性,但所有逻辑都可以放入“方面”,然后在构建项目时自动编译到代码中。
我个人使用PostSharp,虽然我知道还有其他人。他们有免费的开发许可证;只要您不需要高级功能,它就非常经济实惠。
http://www.postsharp.net/blog/post/5-Ways-That-Postsharp-Can-SOLIDify-Your-Code-Authorization