2012-10-29 42 views
12

我创建了一个自定义属性类,该类将检查系统安全性并在出现安全错误时引发身份验证异常。将具有变量值的自定义属性作为参数传递

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); 
+0

首先感谢你这么多你的回应,所以我怎么能做到同样的逻辑,我希望有一个安全检查直接做之前该功能被称为?! –

+0

@SamirAdel我提供了另一种替代方法。 –

+0

非常感谢你的帮助。 –

1

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

我个人使用PostSharp,虽然我知道那里有其他人。他们有一个可用于开发的免费许可证;只要您不需要高级功能,它就非常具有成本效益。

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

+0

fyi你的链接已经死了! –

+0

谢谢@JustinL。 - 任何人都可以编辑SO上的帖子。我已经更新了这个版本,但可以随时提供更多的评论:) – theMayer

相关问题