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

May*_*ayo 5 c# asp.net-mvc lambda attributes

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

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

[CustomAuthorize("Security.Admin.ManageWidgets.Update")]
Run Code Online (Sandbox Code Playgroud)

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

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

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这目前无法实现(Microsoft提供的其他信息).

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

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))]
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*ett 1

您可以使用T4 模板创建具有字符串属性的自定义类,最终得到与 BennyM 类似的代码,但会自动生成。