С#: Как использовать перечисление для хранения строковых констант?
Возможный дубликат:
Перечисление со строками
возможно иметь строковые константы в перечислении типа
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...
Но это тот подход, который я бы взял... да.
Если вы создадите структуру, то она станет типом значения, который может быть или не быть тем, что вы хотели...