C# 创建URL枚举-错误:应为标识符
对这个简单的问题感到羞愧。出于某种原因,我想将所有asp.net URL放在一个枚举中。但我得到了一个错误:C# 创建URL枚举-错误:应为标识符,c#,asp.net,enums,C#,Asp.net,Enums,对这个简单的问题感到羞愧。出于某种原因,我想将所有asp.net URL放在一个枚举中。但我得到了一个错误:identifer应为 我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Admin.Code { public enum url { /_layouts/Admin/test1.aspx,
identifer应为
我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Admin.Code
{
public enum url
{
/_layouts/Admin/test1.aspx,
/_layouts/Admin/test2.aspx,
/_layouts/Admin/test3.aspx
}
class AdminUrlSettings
{
}
}
谢谢。这些不是有效的枚举标识符。您需要字符串枚举。这是一个 您将能够执行以下操作:
public enum url
{
[StringValue("/_layouts/Admin/test1.aspx")]
Test1,
[StringValue("/_layouts/Admin/test2.aspx")]
Test2,
[StringValue("/_layouts/Admin/test3.aspx")]
Test3
}
枚举并不是这样工作的。有效标识符的工作方式与变量名的工作方式相同(即字母、数字和下划线的组合,而不是以数字开头)。为什么不使用列表:
List<string> urls = new List<string>{"/_layouts/Admin/test1.aspx", "/_layouts/Admin/test2.aspx", "/_layouts/Admin/test3.aspx"}
C#中的标识符不能包含/
字符。它们仅限于下划线、字母和数字(可能还有@
前缀)。要解决此问题,需要使枚举值成为有效的C#标识符
enum url {
test1,
test2,
test3
}
稍后,可以使用switch语句将这些url转换为实际有效的url
public static string GetRelativeUrl(url u) {
switch (u) {
case url.test1:
return "/_layouts/Admin/test1.aspx";
case url.test2:
return "/_layouts/Admin/test2.aspx";
case url.test3:
return "/_layouts/Admin/test3.aspx";
default:
// Handle bad URL, possibly throw
throw new Exception();
}
}
我已经做了很多次,将枚举值转换为“友好字符串”。还可以使用它创建“字符串值”枚举。它与Msonic的解决方案的思路相同,但该属性内置于框架中
public enum url
{
[Description(@"/_layouts/Admin/test1.aspx")] Test1,
[Description(@"/_layouts/Admin/test2.aspx")] Test2,
[Description(@"/_layouts/Admin/test2.aspx")] Test3
}
...
public static string GetDescription(this Enum enumValue)
{
object[] attr = enumValue.GetType().GetField(enumValue.ToString())
.GetCustomAttributes(typeof (DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute) attr[0]).Description;
return enumValue.ToString();
}
//usage
Response.Redirect(url.Test1.GetDescription());
请删除“[等]”,这会混淆对方的意思。请不要这样做。请将它们放入列表。@当然,您可以创建一个与上述methodStringValueAttribute等效的属性,该属性不是内置的,但您可以对DescriptionAttributes执行完全相同的操作。
public enum url
{
[Description(@"/_layouts/Admin/test1.aspx")] Test1,
[Description(@"/_layouts/Admin/test2.aspx")] Test2,
[Description(@"/_layouts/Admin/test2.aspx")] Test3
}
...
public static string GetDescription(this Enum enumValue)
{
object[] attr = enumValue.GetType().GetField(enumValue.ToString())
.GetCustomAttributes(typeof (DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute) attr[0]).Description;
return enumValue.ToString();
}
//usage
Response.Redirect(url.Test1.GetDescription());