2011-07-20 34 views
5

我有一个CustomAuthorize属性,用于检查用户是否有权访问功能(用户或角色可以与层次集函数中的项目相关联)。在设计/构建时检查自定义属性参数

对于给定的操作方法......

[CustomAuthorize("Security.Admin.ManageWidgets.Update")] 

这工作,但我担心更改安全对象可能会导致不会直到运行时发现的问题。我意识到我可以编写单元测试来减轻这种风险,但我想知道是否可以在编译时检查属性参数。我也喜欢让Intellisense帮我输入这个表达式。

理想情况下,我可以传递一个lambda表达式。

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)] 

不幸的是这is not currently possibleadditional info from Microsoft)。

我也试过封装表达希望它会进行评估,然后传递到该属性为一个字符串,但是这也失败,同样的错误(表达式不能包含匿名方法或lambda表达式)进行编译。

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))] 

我如何可以添加我的自定义一些设计时/编译时支持属性参数?

+0

+1有趣的问题。 – Mrchief

回答

1

您可以使用T4 templates创建具有字符串属性的自定义类,最终的代码类似于BennyM's,但会自动生成。

+0

这可能让我走上了正确的轨道 - 我的Security对象已经自动生成,我可以为每个具有完全限定名的类/子类添加一个const。它并不完全验证字符串是否正常,但由于它是自动生成的,我可以安全地做出这样的假设(并且我得到智能感知)。 – Mayo

3

带常数的静态类。

public static class Rights 
{ 
    public const string UpdateWidgets = "UpdateWidgets"; 
} 

还包括与他们装饰的方法,你会很好的unittests。

[CustomAuthorize(Rights.UpdateWidgets)] 
1

不,你不能在编译时检查这些各种各样的事情 - 你可以抱最好的希望是一个生成后的步骤,通过反射检查这一点。

您可以改为提供一个类型和方法名,如:

[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")] 

但看到你仍然需要键入其值得商榷什么好处这真的获得你的方法的名称。