C# - преобразование одного перечисления в другое

у меня есть 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 ответов


SystemPersonTitles newValue = (SystemPersonTitles)(int)PersonTitle.Mr;

из головы, я не могу проверить это, как я в настоящее время на моем OSX.


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

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

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


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

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

SystemPersonTitles newTitle = (SystemPersonTitles)title;

бросьте его в int а затем вернемся к другому перечислению.

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

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

SystemPersonTitles systemPersonTitle = (SystemPersonTitles)personTitle;

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

(SystemPersonTitles)PersonTitle.Mr;

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

public bool TryConvertToSystemPersonTitles(
    PersonTitle personTitle, out SystemPersonTitles result)
{
    return Enum.TryParse(personTitle.ToString(), out result);
}

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

PersonTitle person = PersonTitle.Mr;

SystemPersonTitles system = (int) person;

это будет делать преобразование в соответствии со значением int.

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

PersonTitle person = PersonTitle.Mr;

SystemPersonTitles sys = (SystemPersonTitles)Enum.Parse(person.GetType(), person.ToString());

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

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
}

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


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