到目前为止,我有这样的事情:
public enum MyEnum
{
[Display(Name="FirstElement")]
element1 = 1,
[Display(Name="SecondElement")]
element2 = 2
}
在视图中,如果我使用:
Html.EnumDropDownListFor(x=>x.EnumProperty)
拥有:
public MyEnum EnumProperty {get;set;}
在视图模型上,下拉列表按预期工作(我看到FirstElement
,附加的值为element1
)
问题在于我希望在值中加速,如下所示:
public enum MyEnum
{
[Display(Name="FirstElement")]
element1 = 1,
[Display(Name="SecondElement")]
element2 = 2,
[Display(Name="Third")]
element-dashed = 3
}
它不起作用,因为element-dashed不是有效条目。 这也不起作用:
[Value("element-dashed")]
[Display(Name="Third")]
elementDashed = 3
答案 0 :(得分:0)
你的问题的答案很简单。但它需要一个解释,解释为什么这就是答案。
在枚举中没有功能性原因需要破折号。
假设我有一个有效的应用程序,其中包含您的枚举:
public enum MyEnum
{
[Display(Name="FirstElement")]
element1 = 1,
[Display(Name="SecondElement")]
element2 = 2
}
假设我更改了枚举器名称:
public enum MyEnum
{
[Display(Name="FirstElement")]
BatmanIsBruceWayne = 1,
[Display(Name="SecondElement")]
SupermanIsClarkKent = 2
}
我假设代码中每个enum的使用也都相应调整。如果在VS(F2)中使用重命名方法,则会自动出现这种情况。
关于应用程序的工作方式没有任何改变。从功能上讲,枚举的名称无关紧要。
public enum CardSuit { Hearts, Spades, Diamonds, Clubs }
public enum CardSuit { TheRedOne, TheBlackOne, TheOtherRedOne, TheOtherBlackOne }
当然,第一个对开发人员来说比第二个更易读。但是,编译器不关心枚举名称的含义。它只关心始终使用适当的值。
这与变量名称的原理相同。虽然我们当然应该注意使开发人员可以读取变量名称;没有技术原因(即应用程序的功能)为什么我们应该使用int myDescriptiveInteger
而不是int x
。
我们只选择一个描述性名称,以便为维护代码的人提供可读性。
只有一个例外:如果您在枚举上调用.ToString()
,则为了使用您正在使用的字段的字符串表示。
注意:虽然这在技术上是可行的,而且之前已由其他人完成;我不知道这是不是你应该在这里做什么。您已经将明确的int值分配给枚举值。这些int值更容易保存/加载枚举,而不是尝试使用其等效的字符串。虽然两者在技术上都是可行的,但由于占用空间较小以及缺少您错误地尝试修复的命名问题,使用int会更好。
从您的问题中不清楚您是否属于这种情况。也许它已经在您的应用程序中的某个地方完成,也许它不是。没有你告诉我,我无法知道。
如果没有完成,那么您的问题在功能上无关紧要。除了可读性之外,这个名称并不重要,我相信你的开发人员不会突然停止理解代码的意图,因为缺少了一些冲突。
如果已完成,那么您实际上已经提供了问题的答案。而不是在枚举上调用.ToString()
;相反,您必须使用[Display(Name="FirstElement")]
的值作为枚举的正确“字符串名称”。
public static string GetName(this myEnum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.GetCustomAttribute<DisplayAttribute>()
.GetName();
}
然后您可以更改以下代码:
myEnumValue.ToString();
以下代码正确使用属性的值而不是枚举字段名称:
myEnumValue.GetName();
在这两种情况下,核心答案都保持不变:您无需担心枚举字段的具体名称,因为它在功能上无关紧要。
编辑如果您想要在组合框中以不同的方式显示枚举值,请在保存值时使用它,然后使用第二个属性来区分这两者。但原则仍然存在:不要让自己偏离字段名称而不是枚举使用。
我想再次强调你应该使用枚举的整数值。我没有理由为什么你会明确地为你的枚举赋值int然后拒绝使用它们。