我创建了一个名为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表达式或数组创建表达式
答案 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" }
}
这显然需要工作,我不知道字典是什么意思。注意它有副作用或需要资源,在构造属性时你不知道运行时状态。