這很可能是你的代碼最終會編譯UI元素的列表隱藏,或執行給定的動作,然後執行基於當前角色的行動。類似於
Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>>
{
{ button, (c, r) => c.Enabled = (r == "administrator") },
// etc.
};
如何編譯該列表主要是您的問題所關心的問題。 AOP框架絕對有助於解決問題,但自制解決方案不是不可能的。我在想:
- 創建一個
EnableForRoleAttribute
,參數role
。
- 反映在您的表格上(可能使用反射來查找表格,或者可能直接將它們提供給您的代碼,或者甚至找到用您創建的
RoleVaryingAttribute
裝飾的表格)。
- 反映在您的表單的字段中,篩選
Control
實例,然後針對Control
實例使用EnableForRoleAttribute
。
- 現在你有你的名單!根據角色設置
Enabled
。
以上項目符號列表是特定於Enabled
例子,主要是因爲屬性不能把lambda表達式作爲參數:(。你可以用SetPropertyIfInRoleAttribute
與參數role
,propertyName
和propertyValue
,或者任何這樣更靈活。建設
基本上,AOP框架,使這項工作更容易爲你,有的像PostSharp做到這一點,在編譯時,而不是運行但自制的解決方案是非常有效的太
Domenic - 。感謝時,SetPropertyIfInRoleAttribute (或SetPropertyByRole屬性)似乎是一個很好的中間立場,而且從這一刻起我傾向於這種方式。很好的解釋,謝謝澄清。現在我看到,在一個Attribute構造函數中的lambda會非常有用! – grefly 2010-12-16 17:13:47
作爲後續,我使用PostSharp遇到的問題是我無法獲得自定義屬性,因爲我在實例級別上裝飾了.NET框架類(文本框等)。我想我會再次遇到同樣的問題。雖然你對原始問題提供了很好的答案,但一個答案通常會導致另外兩個問題...... = D – grefly 2010-12-16 17:16:52