C # - конвертировать одно перечисление в другое - PullRequest
7 голосов
/ 04 октября 2011

У меня есть 2 перечисления

public enum PersonTitle{
   Mr=0,Ms=1,Mrs=2
}

public enum SystemPersonTitles{
   Mr=0,Ms=1,Mrs=2
}

Как преобразовать одно в другое (без случаев переключения или операторов If) .

public void SystemPersonTitles TellWhatYouAre(PersonTitle personTitle){
//here
}
//usage
SystemPersonTitles systemPersonTitles = TellWhatYouAre(PersonTitle.Ms);

Ответы [ 8 ]

12 голосов
/ 04 октября 2011
SystemPersonTitles newValue = (SystemPersonTitles)(int)PersonTitle.Mr;

Я не могу проверить это из-за того, что сейчас использую OSX

8 голосов
/ 04 октября 2011

Перечисления - это просто прославленные целые числа, поэтому вы можете просто разыгрывать одно из другого:

public SystemPersonTitles TellWhatYouAre(PersonTitle personTitle)
{
    return (SystemPersonTitles)personTitle;
}

Обратите внимание, что это преобразование основано на значениях int, а не на именах.

3 голосов
/ 04 октября 2011

Так как оба в основном являются int, вы можете просто разыграть его.

Итак, если у вас есть экземпляр PersonTitle с именем title, вы можете сделать это:

SystemPersonTitles newTitle = (SystemPersonTitles)title;
3 голосов
/ 04 октября 2011

Приведите его к int и затем вернитесь к другому Enum.

public void SystemPersonTitles TellWhatYouAre(PersonTitle personTitle){
    int value = (int)personTitle;
    var systemPersonTitle = (SystemPersonTitles)value;
}

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

SystemPersonTitles systemPersonTitle = (SystemPersonTitles)personTitle;
2 голосов
/ 04 октября 2011

Если вы хотите конвертировать их по значению, вы можете использовать это:

(SystemPersonTitles)PersonTitle.Mr;

Если вы хотите конвертировать их по имени, вы можете использовать это:

public bool TryConvertToSystemPersonTitles(
    PersonTitle personTitle, out SystemPersonTitles result)
{
    return Enum.TryParse(personTitle.ToString(), out result);
}
1 голос
/ 04 октября 2011

Нет прямого способа сделать это, и это правильный путь.Допустим, вы могли бы сделать:

personTitle = systemPersonTitle;

что произойдет с вашим кодом, если SystemPersonTitles изменится на любой из этих:

public enum SystemPersonTitles1{
   Mr=1,Ms=2,Mrs=3
}

public enum SystemPersonTitles2{
   Mr=0,Ms=1,Mrs=2,UnKnown=3
}

public enum SystemPersonTitles3{
   Mrs=0,Ms=1,Mr=2
}

Или любое другое изменение, которое вы можете подумать.1007 * уверен, что вы можете обойти это ограничение, но это просто плохое программирование.Если вы решили использовать их значение "int" и потерять способность enum.просто используйте "int", чтобы начать с ...

1 голос
/ 04 октября 2011

Вы можете сделать это:

PersonTitle person = PersonTitle.Mr;

SystemPersonTitles system = (int) person;

Это выполнит преобразование в соответствии со значением int.

Если вы хотите сделать это по имени, выполните:

PersonTitle person = PersonTitle.Mr;

SystemPersonTitles sys = (SystemPersonTitles)Enum.Parse(person.GetType(), person.ToString());
0 голосов
/ 04 октября 2011

Что-то вроде (SystemPersonTitles) (int) personTitle

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