Преобразовать строку в перечисление в функции - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть метод, который принимает два перечисления и возвращает bool[]. Однако на практике у меня есть строка, которую я хочу передать, преобразовав ее в перечисление.

У меня есть следующий код:

    path = StatePath.statePath(Enum.GetName(typeof(StatePath.States), currentState), (Enum.GetName(typeof(StatePath.States), stable_state_ENDDR));

Здесь currentState и stable_state_ENDDR - это строки, которые я извлекаю из некоторого другого кода. Значения этих строк совпадают с перечислениями в перечислении States. Код выдает ошибку, говоря, что я не могу преобразовать строку в enum. Я попробовал несколько примеров, которые я нашел в StackOverflow и Google, но ни одно из решений не сработало. Что делать?

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Позвоните Enum.Parse и приведите возвращаемое значение к вашему типу перечисления, например:

string currentState = "...";
States states = (StatePath.States)Enum.Parse(typeof(StatePath.States), currentState);

Также существует перегрузка TryParse:

if (Enum.TryParse(typeof(StatePath.States), currentState, out object o))
    StatePath.States states = (StatePath.States)o;

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

if (Enum.TryParse(currentState, out StatePath.States state))
0 голосов
/ 09 апреля 2020

Не зная сигнатуру функции, на это довольно сложно ответить, но я думаю, что вы ищете Enum.TryParse : объявите перечисления eCurrentState и eStable_state_ENDDR, затем используйте

Enum.TryParse(currentState, out eCurrentState);

Enum.TryParse(stable_state_ENDDR, out eStable_state_ENDDR);

path = StatePath.statePath(eCurrentState, eStable_state_ENDDR);

В случае сбоя TryParse возвращается false.

При этом общее правило состоит в том, чтобы избегать подобных сценариев ios и передавать перечисления как int или bit flags, это потому, что внутри хранятся перечисления, и не требуется никакой функции преобразования, чтобы замедлить вас. По сути, SomeEnum == someIntValue будет работать напрямую без какого-либо преобразования. Таким образом, предполагая, что вы получаете данные с какого-либо сервера / базы данных, просто запросите данные в виде значения цифра c, равного индексу перечисления, объявленного в . И наоборот, сохраните данные таким же образом.

, например, с любым перечислением, без объявленных атрибутов

enum SomeEnum
{
    abc, // 0
    def, // 1
    g    // 2
}

abc == 0, def == 1, g == 2, вернет true.

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