строковое представление перечисления (estring)? - PullRequest
2 голосов
/ 02 февраля 2011

Мне нужно перечисление или что-то подобное, чтобы сделать что-то вроде этого:

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

возможно ли это?В моем примере я возвращаю набор данных со значением, представленным как A, B, C, D, E .. Мне нужно решение, чтобы вернуть это как строковое представление?

Я думаю, очевидным было бысоздать метод расширения или что-то, в чём только что был оператор switch, и вернуть строку ... какие-нибудь другие более чистые решения?

regards, dave

Ответы [ 6 ]

7 голосов
/ 02 февраля 2011

Вот что мы используем для наших приложений 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 голос
/ 03 февраля 2011

Будет ли вариант не использовать enum и использовать вместо него структуры?

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.
}

Затем вы можете использовать FooEnum как enum с собственной перегрузкой ToString ():

FooEnum foo = FooEnum.A;
string s = foo.ToString(); //"Foo A"
1 голос
/ 02 февраля 2011

Если вы хотите сделать что-то вроде этого:

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;
}
0 голосов
/ 08 июля 2011

Я думаю , это может помочь.Я согласен, что вы должны создать оболочку UI для перечисления.

0 голосов
/ 02 февраля 2011

Самое чистое решение этой проблемы - создать пользовательский атрибут, который будет хранить строковое значение, которое вы хотите для константы enum. Я использовал эту стратегию в прошлом, и она сработала довольно хорошо. Вот сообщение в блоге, детализирующее вовлеченную работу:

Перечисление со строковыми значениями в C # - Блог Стефана Седича

Конечно, это необходимо, только если вам нужен какой-то осмысленный текст. Если имя константы enum работает для вас ... тогда вы можете просто позвонить ToString().

0 голосов
/ 02 февраля 2011

Я видел, что это сделано, где я бы положил

MyStringEnum.Foo.ToString();

В этом случае это даст "A"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...