преобразовать перечисление в другой тип перечисления - PullRequest
100 голосов
/ 30 ноября 2009

У меня есть перечисление, например, 'Gender' (Male =0 , Female =1), и у меня есть другое перечисление от службы, которая имеет свой собственный enmen Пол (Male =0 , Female =1, Unknown =2)

У меня вопрос, как я могу написать что-то быстрое и приятное для преобразования из их перечисления в мое?

Ответы [ 13 ]

1 голос
/ 26 октября 2018
public static TEnum ConvertByName<TEnum>(this Enum source, bool ignoreCase = false) where TEnum : struct
{
    // if limited by lack of generic enum constraint
    if (!typeof(TEnum).IsEnum)
    {
        throw new InvalidOperationException("enumeration type required.");
    }

    TEnum result;
    if (!Enum.TryParse(source.ToString(), ignoreCase, out result))
    {
        throw new Exception("conversion failure.");
    }

    return result;
}
1 голос
/ 25 ноября 2015

Я знаю, что это старый вопрос и у меня много ответов, однако я считаю, что использование оператора switch, как в принятом ответе, несколько обременительно, поэтому вот мои 2 цента:

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

var genderTranslator = new Dictionary<TheirGender, MyGender>();
genderTranslator.Add(TheirGender.Male, MyGender.Male);
genderTranslator.Add(TheirGender.Female, MyGender.Female);
genderTranslator.Add(TheirGender.Unknown, MyGender.Unknown);

// translate their to mine    
var myValue = genderTranslator[TheirValue];

// translate mine to their
var TheirValue = genderTranslator .FirstOrDefault(x => x.Value == myValue).Key;;

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

public static class EnumTranslator
{

    private static Dictionary<TheirGender, MyGender> GenderTranslator = InitializeGenderTranslator();

    private static Dictionary<TheirGender, MyGender> InitializeGenderTranslator()
    {
        var translator = new Dictionary<TheirGender, MyGender>();
        translator.Add(TheirGender.Male, MyGender.Male);
        translator.Add(TheirGender.Female, MyGender.Female);
        translator.Add(TheirGender.Unknown, MyGender.Unknown);
        return translator;
    }

    public static MyGender Translate(this TheirGender theirValue)
    {
        return GenderTranslator[theirValue];
    }

    public static TheirGender Translate(this MyGender myValue)
    {
        return GenderTranslator.FirstOrDefault(x => x.Value == myValue).Key;
    }

}
0 голосов
/ 30 ноября 2009

Вы можете использовать ToString () для преобразования первого перечисления в его имя, а затем Enum.Parse () для преобразования строки обратно в другое перечисление. Это вызовет исключение, если значение не поддерживается целевым перечислением (то есть для значения «Неизвестно»)

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