c#: как использовать перечисление для хранения строковых констант? [дубликат]


Возможные Дубликаты:
перечисление со строки

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

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

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

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

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

4 ответа:

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

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

но если вы не хотите использовать строку в качестве типа в сигнатурах метода, и вы предпочитаете более безопасный, более ограничительный тип (например,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; }
}

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

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

    [Description("YourName2")]
    Name2
}

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

  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();   

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

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

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