您可以访问特定枚举值的详细描述吗
Posted
技术标签:
【中文标题】您可以访问特定枚举值的详细描述吗【英文标题】:Can you access a long description for a specific enum value 【发布时间】:2009-09-24 20:08:32 【问题描述】:我通常访问枚举描述以获取相应的值,例如:
Enum.GetName(typeof(MyEnum), myid);
我需要一个可以使用任何字符的枚举,例如“hello world %^$£%&”
我见过有人像这里这样附加属性并添加扩展:
http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx
但我不知道这是否可以用来访问长描述。
有人做过类似的吗?
谢谢
戴维
【问题讨论】:
为清楚起见,您能否发布一个您想使用的枚举示例? 为什么你的枚举名称这么长?通常,枚举只是程序员在代码中引用数值的助记符,而不是存储字符串值的方法。通常,当让用户选择从枚举中选择给定值或出于显示目的时,检索名称是明智的。 @Achilles:通常枚举会附带一些描述性文本,因此是长名称的原因。 我同意,但有人要求我这样做:( public enum PriceIndexType : int [StringValue("RPI (所有项目不包括抵押")] RPI1 = 1, [StringValue("RPI ( All Items)")] RPI2 = 2, 我想存储 int 值,但是说当我返回一个列表时,我想显示 long 值。谢谢 仅供参考 myid.ToString 将返回 ENum 的名称,除非 myId 不是枚举的类型,然后您只需键入它 ((MyEnum)myId).ToString() 【参考方案1】:为什么不成功?
您可以通过继承 Attribute 来创建自己的属性
public class EnumInformation: Attribute
public string LongDescription get; set;
public string ShortDescription get; set;
public static string GetLongDescription(this Enum value)
// Get the type
Type type = value.GetType();
// Get fieldinfo for this type
FieldInfo fieldInfo = type.GetField(value.ToString());
// Get the stringvalue attributes
EnumInformation [] attribs = fieldInfo.GetCustomAttributes(
typeof(EnumInformation ), false) as EnumInformation [];
// Return the first if there was a match.
return attribs != null && attribs.Length > 0 ? attribs[0].LongDescription : null;
public static string GetShortDescription(this Enum value)
// Get the type
Type type = value.GetType();
// Get fieldinfo for this type
FieldInfo fieldInfo = type.GetField(value.ToString());
// Get the stringvalue attributes
EnumInformation [] attribs = fieldInfo.GetCustomAttributes(
typeof(EnumInformation ), false) as EnumInformation [];
// Return the first if there was a match.
return attribs != null && attribs.Length > 0 ? attribs[0].ShortDescription : null;
你的枚举应该是这样的
public enum MyEnum
[EnumInformation(LongDescription="This is the Number 1", ShortDescription= "1")]
One,
[EnumInformation(LongDescription = "This is the Number Two", ShortDescription = "2")]
Two
你可以这样使用它
MyEnum test1 = MyEnum.One;
Console.WriteLine("test1.GetLongDescription = 0", test1.GetLongDescription());
Console.WriteLine("test1.GetShortDescription = 0", test1.GetShortDescription());
输出
test1.GetLongDescription = 这是数字 1
test1.GetShortDescription = 1
您实际上可以向属性添加属性以获得各种信息。然后你可以支持你正在寻找的本地化。
【讨论】:
我有一个,但我只能说 MyEnum,MyDesc.GetstringValue(),就像我附加的链接中一样。然后我需要做一些混乱的事情,比如: if (Enum.GetName(typeof(MyEnum), myid) == "RPI1" return PriceIndex.RPI1.GetstringValue(); else if (Enum.GetName(typeof(MyEnum), myid ) == "RPI2" return PriceIndex.RPI2.GetstringValue(); 凌乱:( 在您的枚举示例中,它说:[LongDescription(LongDescription="This is the Number 1", ShortDescription="1")]。这不应该是 [EnumInformation(LongDescription="This is the Number 1", ShortDescription="1")]?【参考方案2】:“长描述”是什么意思?我有一个library,它允许您将Description
属性附加到枚举值并获取它们:
public enum Foo
[Description("This is a really nice piece of text")]
FirstValue,
[Description("Short but sweet")]
Second,
如果您在谈论 XML 文档,那是另一回事 - 它不会内置到二进制文件中,因此您还必须构建/发送 XML,然后在执行时获取它。这是可行的,但我没有代码可以立即完成......
【讨论】:
@Jay:作为一种庆祝措施,我将把所有的帖子都写到星期一。 我在数据库中存储了一个 int。然后我如何从数据库中读取该值,然后获取相应的“这是一段非常好的文本位”以显示该行而不是“FirstValue”? @Davy 您必须将其转换为非常简单的 Enum,它是 (MyEnum)myId == MyEum 感谢 Dave - return ((PriceIndexType)this.PriceIndexId).GetStringValue();正是我想要的。【参考方案3】:我倾向于远离这种做法。如果您考虑一下,它会将您的代码逻辑绑定到您键入代码的方式。使用switch语句、资源文件、数据库等会好很多……
我很难学到这一点。我有一个应用程序,我们最终决定对其进行混淆以帮助保护我们的代码。正如您所想象的,由于枚举在混淆过程中被重命名,我们的二进制文件不再按照我们想要的方式工作。
【讨论】:
谢谢 - 我同意但已被要求这样做 - 将向老板展示这些有用的回复:)【参考方案4】:如果您需要一种简单的方法来提取枚举值的描述属性,请查看my answer to a similar question
您只需要在值上调用GetDescription
扩展方法:
string description = myEnumValue.GetDescription();
Jon 提到的Unconstrained Melody 库包含一个类似的扩展方法(以及许多其他很酷的东西),您应该检查一下。
【讨论】:
以上是关于您可以访问特定枚举值的详细描述吗的主要内容,如果未能解决你的问题,请参考以下文章
我可以获取下载我的 Android 应用程序的用户的详细信息吗?