【问题标题】:Checking custom attribute parameters at design/build time在设计/构建时检查自定义属性参数
【发布时间】:2011-10-09 12:32:47
【问题描述】:

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

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

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

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

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

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

不幸的是这个is not currently possible (additional info from Microsoft)。

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

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

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

【问题讨论】:

  • +1 解决一个有趣的问题。

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


【解决方案1】:

带有常量的静态类。

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

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

[CustomAuthorize(Rights.UpdateWidgets)]

【讨论】:

    【解决方案2】:

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

    【讨论】:

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

    不,您不能在编译时检查这些事情 - 您可以期望的最好的结果是通过反射检查这些的构建后步骤。

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

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

    但是看到你仍然需要输入方法的名称,这有什么好处值得商榷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多