14

我创建了一个自定义属性类,它将检查系统安全性并在出现安全错误时引发身份验证异常。

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
}
4

2 回答 2

13

这样的事情能做到吗?!

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

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

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

这将使您可以通过以下方式调用:

int result = CheckedAddEntity(entityId, AddNewEntity);
于 2012-10-29T15:52:51.990 回答
1

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

我个人使用 PostSharp,尽管我知道还有其他人。他们有可用于开发的免费许可证;只要您不需要高级功能,它就非常划算。

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

于 2012-10-29T16:13:41.580 回答