在设计/构建时检查自定义属性参数

时间:2011-07-20 15:35:34

标签: c# asp.net-mvc attributes lambda

我有一个CustomAuthorize属性,用于检查用户是否可以访问功能(用户或角色可以与一组分层函数中的项目相关联)。

对于给定的行动方法......

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

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

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

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

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

我也尝试封装表达式,希望它被评估,然后作为字符串传递给属性,但是也无法使用相同的错误进行编译( Expression不能包含匿名方法或lambda表达式 )。

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

如何为自定义属性参数添加一些设计时/构建时支持?

3 个答案:

答案 0 :(得分:3)

带有常量的静态类。

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

还包括用它们装饰的方法的单元测试,你会很好。

[CustomAuthorize(Rights.UpdateWidgets)]

答案 1 :(得分:1)

不,你不能在编译时检查这些类型的东西 - 你可能希望的最好的是一个构建后的步骤,通过反射检查这一点。

您可以改为提供类型和方法名称,如下所示:

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

但是看到你仍然需要输入方法的名称,这是有争议的,这真正让你获益。

答案 2 :(得分:1)

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