关于c#:您是否可以访问特定枚举值的长描述

Can you access a long description for a specific enum value

我通常访问对应值的枚举描述,例如:

enum.getname(typeof(myenum),myid);

我需要一个枚举,它可以使用任何字符,如"hello world%^$impull%&;"

我见过有人附加了一个属性并添加了如下扩展:

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

但我不知道这是否可以用来获取详细的描述。

有人做过类似的事吗?

谢谢

戴维


为什么不行?

可以通过从属性插入来创建自己的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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;
}

您的枚举将如下所示

1
2
3
4
5
6
7
public enum MyEnum
{
    [EnumInformation(LongDescription="This is the Number 1", ShortDescription="1")]
    One,
    [EnumInformation(LongDescription ="This is the Number Two", ShortDescription ="2")]
    Two
}

你可以这样用

1
2
3
4
MyEnum test1 = MyEnum.One;

Console.WriteLine("test1.GetLongDescription = {0}", test1.GetLongDescription());
Console.WriteLine("test1.GetShortDescription = {0}", test1.GetShortDescription());

它输出

test1.GetLongDescription = This is the Number 1

test1.GetShortDescription = 1

实际上,您可以向属性添加属性以包含各种信息。然后,您可以支持您要查找的本地化。


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

1
2
3
4
5
6
7
public enum Foo
{
    [Description("This is a really nice piece of text")]
    FirstValue,
    [Description("Short but sweet")]
    Second,
}

如果您谈论的是XML文档,那是另一回事——它没有内置到二进制文件中,因此您还必须构建/传送XML,然后在执行时获取它。这是可行的,但我没有现成的代码…


如果您需要一种简单的方法来提取枚举值的描述属性,请查看我对类似问题的回答。

您只需对以下值调用GetDescription扩展方法:

1
string description = myEnumValue.GetDescription();

乔恩提到的不受约束的旋律库包括一个类似的扩展方法(除了许多其他很酷的东西),您应该检查一下。


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

我很难学会这一点。我有一个应用程序,我们最终决定模糊,以帮助保护我们的代码。正如您可以想象的那样,由于枚举在模糊期间被重命名,我们的二进制文件停止了我们想要的工作方式。