【问题标题】:Can you evaluate an attribute on a method at runtime?您可以在运行时评估方法的属性吗?
【发布时间】:2011-05-17 20:52:00
【问题描述】:

我有一个松散地基于 MVVM 的 Winforms 项目。安全性由域层使用 PrincipalPermissionAttribute 实现,如下所示:

Public Class Order

     <PrincipalPermissionAttribute(SecurityAction.Demand, Role:="Managers")> _
    Public Sub ChangeBillingAddress(NewAddress as Address)

        Me.BillingAddress = NewAddress

    End Sub


End Class

我希望我的 ViewModel 能够根据域中的 PrincipalPermissionAttribute 指示视图启用/禁用哪些控件:

Public Class OrderViewModel

    Private _Order as Order
    Public Sub New(Order as Order)
        _Order = Order
    End Sub

    Public Readonly Property ChangeBillingAddressEnabled as Boolean
        Get
            'Here I want to take Thread.CurrentPrincipal and evaluate
            'it's Role against the PrincipalPermissionAttribute on 
            '_Order.ChangeBillingAddress.  If the user will succeed
            'in changing the billing address return True, else return False.
        End Get

    End Property
End Class

有没有办法让 ViewModel 评估 PrincipalPermissionAttribute 并确定当前的 Thread.Principal 是否会成功?

【问题讨论】:

    标签: .net vb.net mvvm attributes


    【解决方案1】:

    是的,你绝对可以取回方法的属性并用它们做一些事情。

    例如(对不起,在 C# 中):

    return _Order.GetType()
                 .GetMethod("ChangeBillingAddress")
                 .GetCustomAttributes(typeof(PrincipalPermissionAttribute), true)
                 .Cast<PrincipalPermissionAttribute>()
                 .All(r => IsPermittedAccess(r, Thread.CurrentPrincipal));
    

    您可以在哪里确定如何处理该属性:

    bool IsPermittedAccess(PrincipalPermissionAttribute rule, IPrincipal user)
    {
        // return ?
        throw new NotImplementedException();
    }
    

    我将决定用户是否满足属性要求的最后一项任务。我对框架的那部分不够熟悉。您还可以处理错误处理(例如,该名称的方法不存在)。

    我还要补充一点,您可能希望缓存(也许在静态字段中?)方法上的反射结果,因为它永远不会改变。您还需要确保您的视图模型在主体更改或主体的角色集合更改时触发属性更改通知(也就是说,如果确实发生了更改)。

    【讨论】:

    • 很好的解决方案。相对来说,你觉得反射调用有多贵?
    • 我不太确定——我只知道常见的建议是,如果可以的话,总是缓存反射数据。我想这取决于您计划调用它的频率...但是,我认为您会将 UI 绑定到此“_Action_Enabled”值,因此这意味着它可能会比您预期的更多地被调用,所以您可能以及缓存它(静态延迟加载的属性就足够了)。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2011-05-27
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多