Как создать объект типа enum со строковыми значениями? - PullRequest
1 голос
/ 01 марта 2012

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

Теперь я пытаюсь использовать enum для сопоставления текста. Например. все условия, любое условие, ничего, альтернативное и т. д. Я пытаюсь использовать enum, поскольку ключевые слова могут измениться позже, Можно ли хранить строковые значения в enum.

public enum condition 
{ 
    type1 = "all the conditions", 
    type2 = "any of the conditions" 
}

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

Ответы [ 3 ]

4 голосов
/ 01 марта 2012

Вы можете использовать свойства строки только для чтения:

public class Condition
{
    public static readonly string Type1 = "All_The_Conditions";
    public static readonly string Type2 = "Any_Conditions";
}

Используйте это так:

if(condition_variable == Condition.Type1)//will do a string compare here.
{
 ...
}

НО

Это решение не будет работать с switch операторами. В этом случае вы можете использовать const

public class Condition
{//this could be a better solution..
    public const string Type1 = "All_The_Conditions";
    public const string Type2 = "Any_Conditions";
}

Вы можете использовать это так:

switch (condition_variable)
{
    case Condition.Type1://can only be done with const
     ....
    break;
}

См. этот пост для статических readonly против const переменных.


Расширить на перечисления (см. MSDN) :

У них есть базовый тип по умолчанию int. Вы можете изменить базовый тип на один из следующих целочисленных типов: byte, sbyte, short, ushort, int, uint, long, or ulong.


Спасибо @Bryan и @R0MANARMY за помощь в улучшении моего ответа.

3 голосов
/ 01 марта 2012

Вместо этого вы можете использовать словарь, чтобы отобразить перечисление (ключ) в строку (значение). Что-то вроде:

Dictionary<Condition, string> dict = new Dictionary<Condition, string>(); 
dict[Condition.Type1] = "all the conditions";

[Редактировать]: На самом деле, теперь, когда я прочитал ваш вопрос более внимательно, я бы сделал это наоборот. Сопоставление должно быть из строки в условие, а затем вы должны сравнить текст со значением ключа (строкой), и, если оно совпадает, вы получите значение enum. то есть:

   Dictionary<string, Condition> dict = new Dictionary<string, Condition>(); 
   Condition result = Condition.Invalid;

   bool isFound = dict.TryGetValue(someTextToParse, out result);

Имеет смысл?

0 голосов
/ 01 марта 2012

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

Альтернативный способ справиться с этим - использовать простой массив struct объектов:

struct ConditionKeywords
{
    int Key;
    string Value;
}
ConditionKeywords[] keyword = { new ConditionKeywords { Key = 1, Value = "all the conditions } /* ... */ };

И простое перечисление, к которому можно получить доступ в коде:

enum ConditionValues
{
    type1 = 1;
}

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

string[] ConditionKeywords { "all the conditions" /* ... */ }

с использованием того же подхода перечисления выше (ограничив его только действительными индексами в ConditionKeywords).

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