路由,编译器错误的属性帮助

时间:2011-02-25 14:34:58

标签: c# attributes routing compiler-errors attributeusage

我创建了一个名为RouteAttribute的自定义属性:

[AttributeUsage(AttributeTargets.Property)]
public class RouteAttribute : Attribute
{
    public string Url { get; set; }
    public bool CheckPhysicalUrlAccess { get; set; }
    public RouteValueDictionary Defaults { get; set; }
    public RouteValueDictionary Constraints { get; set; }
    public RouteValueDictionary DataTokens { get; set; }
}

它用于在我的网址帮助程序类中添加路由,该网址包含我网站中的网址列表,因此我可以轻松管理网站网址。

添加默认值时出现问题,导致编译错误:

[Route("~/MyPage/Home.aspx", new RouteValueDictionary { { "query", "value" } })]
public string HomePage
{
  get { return "Home" }
}

为避免混淆,将值设置为routeurl,物理url来自属性, 原因是,我正在转换一个现有的网站,而不是在任何地方更改链接,一旦我完成了页面,我会去我的班级并将物理网址更改为新页面

发出错误:

  

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

错误告诉您问题究竟是什么。

作为

new RouteValueDictionary { { "query", "value" } }

不是常量表达式,不是typeof表达式而不是数组创建表达式,这是不合法的。

答案 1 :(得分:1)

属性构造函数的参数值存储在元数据中。这严重限制了您可以指定的内容。只是简单的值类型,来自typeof的Type和这些值的简单一维数组。没有代码是允许的,这是编译器抱怨的, new 运算符需要代码。

在属性构造函数的主体中你可以做什么没有限制,该代码稍后在反射代码检查属性时运行。建议类似的东西:

public class RouteAttribute : Attribute
{
    public RouteAttribute(string url, string query, string value) {
       this.url = url;
       this.dunno = new RouteValueDictionary(query, value);
    }
    // etc..
}
...
[Route("~/MyPage/Home.aspx", "query", "value")]
public string HomePage
{
  get { return "Home" }
}

这显然需要工作,我不知道字典是什么意思。注意它有副作用或需要资源,在构造属性时你不知道运行时状态。