您是否可以访问特定枚举值的长描述

时间:2009-09-24 20:08:32

标签: c# enums attributes

我通常访问枚举描述以获得相应的值,如:

Enum.GetName(typeof(MyEnum),myid);

我需要一个可以使用任何字符的枚举,例如“hello world%^ $£%&”

我看到人们附加了一个属性并添加了像这里的扩展名:

http://weblogs.asp.net/stefansedich/archive/2008/03/12/enum-with-string-values-in-c.aspx

但如果可以使用它来访问长描述,我无法解决。

有人做过类似的事吗?

由于

戴维

4 个答案:

答案 0 :(得分:5)

为什么不能解决问题?

您可以通过从属性

中继承来创建自己的属性
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

您实际上可以向属性添加属性以获取各种信息。然后,您可以支持您正在寻找的本地化。

答案 1 :(得分:2)

“长描述”是什么意思?我有一个library,它允许您将Description属性附加到枚举值并获取它们:

public enum Foo
{
    [Description("This is a really nice piece of text")]
    FirstValue,
    [Description("Short but sweet")]
    Second,
}

如果您正在讨论XML文档,那是另一回事 - 它不会内置到二进制文件中,因此您还必须构建/发送XML,然后在执行时获取它。这是可行的,但我没有代码可以随便做到......

答案 2 :(得分:0)

我倾向于远离这种做法。如果您考虑一下,它会将您的代码逻辑绑定到您键入代码的方式。使用switch语句,资源文件,数据库等会好得多......

我很难学到这一点。我有一个应用程序,我们最终决定混淆,以帮助保护我们的代码。可以想象,由于在混淆过程中重命名了枚举,我们的二进制文件停止了我们想要的工作方式。

答案 3 :(得分:0)

如果您需要一种简单的方法来提取枚举值的描述​​属性,请查看my answer to a similar question

您只需要在值上调用GetDescription扩展名方法:

string description = myEnumValue.GetDescription();

Jon提到的Unconstrained Melody库包含了一个类似的扩展方法(在许多其他很酷的东西中),你应该检查一下。