C# 以变量值作为参数传递自定义属性

C# 以变量值作为参数传递自定义属性,c#,attributes,C#,Attributes,我创建了一个自定义属性类,它将检查系统安全性,并在出现安全错误时抛出身份验证异常 public class EntityChecker: System.Attribute { public EntityChecker(int entityId) { // doing some logic to check if the entityId is allowed to be inserted } } 我想使用这个自定义属性作为实体添加函数的声明,并想将一个变

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

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<int, int> funcToAdd)
{
    // Perform your checking on entityId here
    return funcToAdd();
}

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

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


首先非常感谢您的回复,那么我如何才能执行相同的逻辑,我希望在调用函数之前直接进行安全检查@SamirAdel我提供了另一种方法。我想做完全相同的事情来保护我的服务层如果你的链接死了!谢谢@JustinL仅供参考,任何人都可以在上面编辑帖子。我已经更新了这篇文章,但以后可以发表更多的评论:)
int result = CheckedAddEntity(entityId, AddNewEntity);