将自定义属性与变量值作为参数传递

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
}

我正在考虑做同样的事情来保护我的服务层。 - taher chhabrawala
2个回答

13

这种事情能做到吗?!

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

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

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

这将使您能够通过类似以下方式进行调用:

int result = CheckedAddEntity(entityId, AddNewEntity);

非常感谢您的回复。那么我该如何实现同样的逻辑呢?我希望在调用函数之前直接进行安全检查。 - Samir Adel
@SamirAdel,我提供了另一种可选的方法。 - Reed Copsey

1
在这种情况下,我建议看一下面向方面的编程。这是一种不同的编码方式,但它允许您在整个过程中重复使用样板逻辑(例如身份验证)。您可能需要稍微不同地设计属性,但所有逻辑都可以放入“方面”中,然后在构建项目时自动编译到代码中。
我个人使用PostSharp,虽然我知道还有其他选择。他们提供了一个可用于开发的免费许可证;只要您不需要高级功能,它就非常划算。

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


你的链接已经失效了! - Justin L.
1
谢谢@JustinL。- FYI任何人都可以在SO上编辑帖子。我已经更新了这个,但是将来请随时贡献更多的评论 :) - theMayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接