“显示”和“描述”属性之间的差异

本文关键字:之间 描述 显示 属性 | 更新日期: 2023-09-27 17:58:28

我正在尝试增强我的枚举,所以我尝试了一个关于显示的建议和另一个关于描述。

我很生气,因为我不明白它们之间的区别。描述类和显示类都来自框架4.5。

另外,这很烦人,因为它们都不在代码中工作。我正在测试以下内容,但我只能看到驴子。。。

[Flags]
public enum Donkeys
{
  [Display(Name = "Monkey 1")]
  Donkey1 = 0,
  [Description("Monkey 2")]
  Donkey2 = 1
}

“显示”和“描述”属性之间的差异

这两个属性都不会对枚举的ToString()方法产生任何影响,如果您只是试图将其插入Razor模板,就会调用该方法。ToString()总是使用代码中声明的名称——在您的情况下是Donkey1Donkey2。据我所知,没有内置的方法可以为枚举指定备用字符串表示形式以自动使用。

我认为(至少)有两个原因:

  1. 序列化。ToString()使用该名称,以便Enum.Parse()可以将其解析回枚举中
  2. 本地化。NET是为全球受众而设计的,如果你想要一个人类可读的枚举字符串表示,那么不太可能只有一个字符串表示,此时将由你的应用程序来决定如何做到这一点

如果你知道你的应用程序永远不会被翻译成其他语言,或者如果你只是想要一个可以在调试输出中使用的字符串表示,欢迎你使用一个属性(来自框架的属性,或者你自己声明的属性)为每个枚举值定义一个字符串表示,并编写一些实用函数来进行字符串转换。但是你不能让枚举的ToString()为你做这件事(因为这会破坏序列化);你必须自己写代码才能做到这一点。

然而,由于您正在编写Web应用程序,您很有可能拥有全球受众——在这种情况下,您需要像本地化所有其他文本一样本地化枚举字符串。