属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

时间:2018-03-13 07:32:15

标签: c# attributes

我有这两行:

[AccessDeniedAuthorize(new string[] { "MIS", "Test" })]

[AccessDeniedAuthorize(DAL.RoleHandler.GetRolesForTcode("testMenu"))]

但是第二行有这个错误:

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

但是GetRolesForTcode也会返回string[],为什么会出错?

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary { { "Controller", "AccessDenied" }, { "Action", "Index" } });
        }
    }

    public AccessDeniedAuthorizeAttribute(string[] roles)
    {
        this.Roles = string.Join(",", roles);
    }
}

public class RoleHandler
{
    public static string[] GetRolesForTcode(string tCode)
    {
        using (var db = new Models.VMIEntities())
        {
            var roles = db.T_Auth_Role_Master
                .Where(role => string.Compare(role.obj, "t_code", StringComparison.OrdinalIgnoreCase) == 0)
                .Where(role => string.Compare(role.authobj_value, tCode, StringComparison.OrdinalIgnoreCase) == 0)
                .Select(role => role.role);
            return roles.ToArray();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如你所说,

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

DAL.RoleHandler.GetRolesForTcode("testMenu")不是那些东西。它不是常量表达式,因为它无法在编译时进行求值。方法在运行时进行评估。

根据C#语言规范第17.2节,

如果以下所有语句都为真,则表达式E是attribute-argument-expression:

  
      
  • E的类型是属性参数类型(第17.1.3节)。
  •   
  • 在   编译 -time,E的值可以解析为以下之一:      
        
    • 一个恒定值。
    •   
    • 一个System.Type对象。
    •   
    • attribute-argument-expressions 的一维数组。
    •   
  •   

这就是错误发生的原因。你必须在那里放一个常量表达式。