您可以访问特定枚举值的详细描述吗

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 应用程序的用户的详细信息吗?

这是 Javascript 中枚举的可行实现吗?

如何以编程方式获取完整的 ios 设备详细信息

Admob :广告投放受限 - 您可以展示的广告数量受到限制。有关详细信息,请访问政策中心

我可以使用 ID3 获取 mp3 文件链接的详细信息吗

如何从 CMap 访问元素?