枚举(estring)的字符串表示?

时间:2011-02-02 15:47:54

标签: c# asp.net-mvc-2 .net-4.0

我需要一个枚举或类似的东西来做这样的事情:

  

public enum MyStringEnum {   [StringValue(“Foo A”)] Foo =“A”,   [StringValue(“Foo B”)] Foo =“B”}

这可能吗?我的例子,我返回一个数据集,其值表示为A,B,C,D,E ..我需要一个解决方案将其作为字符串表示返回?

我想显而易见的是创建一个扩展方法或只有一个switch语句并返回一个字符串的东西..还有其他更干净的解决方案吗?

的问候, 戴夫

6 个答案:

答案 0 :(得分:7)

这是我们用于MVC应用程序检索枚举的显示名称的内容。它使用自定义属性和扩展方法来检索枚举显示名称。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumDisplayNameAttribute : Attribute
{
  public EnumDisplayNameAttribute(string displayName)
  {
    DisplayName = displayName;
  }

  public string DisplayName { get; set; }
}


public static string GetDisplayName(this Enum enumType)
{
  var displayNameAttribute = enumType.GetType()
                                     .GetField(enumType.ToString())
                                     .GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
                                     .FirstOrDefault() as EnumDisplayNameAttribute;

  return displayNameAttribute != null ? displayNameAttribute.DisplayName : Enum.GetName(enumType.GetType(), enumType);
}

枚举上的用法:

public enum Foo
{
  [EnumDisplayName("Foo Bar")]
  Bar = 0
}

取回显示名称:

var f = Foo.Bar;
var name =  f.GetDisplayName();

答案 1 :(得分:1)

如果你想做这样的事情:

MyStringEnum value = MyStringEnum.A;
string description = value.GetDescription();
// description == "Foo A"

像这样设置你的枚举:

public enum MyStringEnum
{
    [Description("Foo A")]
    A,
    [Description("Foo B")]
    B
}

并使用读取属性的实用程序/扩展方法:

public static string GetDescription(this MyStringEnum enumerationValue)
{
    Type type = enumerationValue.GetType();
    string name = enumerationValue.ToString();

    //Tries to find a DescriptionAttribute for a potential friendly name for the enum
    MemberInfo[] member = type.GetMember(name);
    if (member != null && member.Length > 0)
    {
        object[] attributes = member[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attributes != null && attributes.Length > 0)
        {
            //Pull out the description value
            return ((DescriptionAttribute)attributes[0]).Description;
        }
    }

    return name;
}

答案 2 :(得分:1)

是不是可以选择不使用枚举而是使用结构?

struct FooEnum
{
    private int value;
    private string name;
    private FooEnum(int value, string name)
    {
        this.name = name;
        this.value = value;
    }

    public static readonly FooEnum A = new FooEnum(0, "Foo A");
    public static readonly FooEnum B = new FooEnum(1, "Foo B");
    public static readonly FooEnum C = new FooEnum(2, "Foo C");
    public static readonly FooEnum D = new FooEnum(3, "Foo D");

    public override string ToString()
    {
        return this.name;
    }

    //TODO explicit conversion to int etc.
}

然后您可以像使用自己的ToString()重载的枚举一样使用FooEnum:

FooEnum foo = FooEnum.A;
string s = foo.ToString(); //"Foo A"

答案 3 :(得分:0)

我已经看到了这样做,我会把

MyStringEnum.Foo.ToString();

在这种情况下,它会给出“A”

答案 4 :(得分:0)

此问题最干净的解决方案是创建一个自定义属性,该属性将存储枚举常量所需的字符串值。我过去曾经使用过这种策略而且效果相当好。这是一篇博文,详细介绍了所涉及的工作:

Enum With String Values In C# - Stefan Sedich's Blog

当然,只有在需要某种有意义的文本时才需要这样做。如果枚举常量的名称适合您...那么您只需拨打ToString()

答案 5 :(得分:0)

我认为this可以提供帮助。我同意您应该为枚举创建UI包装器。