2017-06-20 61 views
1

我建立一個ASP.NET MVC應用5,並按照本SO post的例子申請[Flags]enum上[授權(角色)]使用枚舉[國旗]和位運算符

[Flags] 
public enum Role 
{ 
    User = 1, 
    Finance = 2, 
    Management = 4, 
    SystemAdmin = 8 
} 

注意的是,[Flags]屬性爲我們提供了一個很好的方式來獲得多個值作爲一個逗號分隔字符串:

var roles = (Constants.Role.SystemAdmin | Constants.Role.Management).ToString(); 
// "SystemAdmin, Management" 

枚舉值將在控制器和行動,像這樣的[Authorize]屬性一起使用:

[Authorize(Roles = (Constants.Role.SystemAdmin | Constants.Role.Management).ToString())] 
public class SomeController : Controller 
{ ... } 

然而,上面的屬性生成此錯誤:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

我爲什麼可以使用.ToString()方法,並得到一個CSV在代碼中枚舉,但在[Authorize]屬性用同樣的語句時,不?

+1

因爲,錯誤說*「一個屬性參數必須是一個常量表達式」*。這意味着你不能在屬性中調用一個方法(比如'ToString()'),因爲它不能保證是常量。 –

+0

謝謝,@MattBurland。任何想法如何得到這個工作?或者當它用於像這樣的屬性時,它是不可能的? – Alex

+0

不可能使用這樣的屬性。你可以做的是創建一個屬性,該屬性具有'Role'類型的'RolesEnum'屬性,它在setter中將'Roles'字符串屬性設置爲'value.ToString()'。這可能會起作用。 –

回答

4

因爲屬性是元數據,所以它們的限制是它們的初始化必須是常量。正如你的錯誤所說:

An attribute argument must be a constant expression

ToString()是一個方法調用,所以不能保證是恆定的。這就是爲什麼你可以使用它。

要解決這個問題,你可能能夠繼承Authorize,做這樣的事情:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    private Role roleEnum; 
    public Role RoleEnum 
    { 
     get { return roleEnum; } 
     set { roleEnum = value; base.Roles = value.ToString(); } 
    } 
} 

而且,你可以使用這樣的:

[MyAuthorize(RoleEnum = Constants.Role.SystemAdmin | Constants.Role.Management)] 

^不需要ToString()