С#: Как использовать перечисление для хранения строковых констант?

Возможный дубликат:
Перечисление со строками

возможно иметь строковые константы в перечислении типа

      enum{name1="hmmm" name2="bdidwe"}

если это не лучший способ сделать это?

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

      class operation
      {
          public const string  name1="hmmm";
          public const string  name2="bdidwe"
      }

Ответы

Ответ 1

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

Когда я хочу что-то вроде "переименования на основе строк", я создаю класс для хранения констант, как и вы, кроме того, что я делаю его статическим классом для предотвращения как нежелательного создания, так и нежелательного подкласса.

Но если вы не хотите использовать строку в качестве типа в сигнатурах метода, и вы предпочитаете более безопасный, более ограничительный тип (например, Operation), вы можете использовать безопасный шаблон перечисления:

public sealed class Operation
{
    public static readonly Operation Name1 = new Operation("Name1");
    public static readonly Operation Name2 = new Operation("Name2");

    private Operation(string value)
    {
        Value = value;
    }

    public string Value { get; private set; }
}

Ответ 2

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

public enum YourEnum
{
    [Description("YourName1")]
    Name1,

    [Description("YourName2")]
    Name2
}

Ответ 3

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

  enum Operation
  {
      name1,
      name2
  }

  static class OperationTextExtender
  {
        public static String AsText(this Operation operation)
        {
              switch(operation)
              {
                    case Operation.name1: return "hmmm";
                    case Operation.name2: return "bdidwe";
                    ...
              }
        }
  }

  ...
  var test1 = Operation.name1;
  var test2 = test1.AsText();   

Ответ 4

Ваш класс operation не будет компилироваться как есть... вы не объявили тип name1 и name2...

Но это тот подход, который я бы взял... да.

Если вы создадите структуру, то она станет типом значения, который может быть или не быть тем, что вы хотели...