Я знаком с тем, как получить отображаемое имя из значения перечисления, в основном я просто использую
public static string GetDisplayName(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DisplayAttribute>()
.GetName();
}
но для моего случая мне нужно получить все отображаемые имена для всех языков, которые поддерживает мое приложение. У меня есть ниже, который работает, но я не могу себе представить, что это лучшая идея:
System.Globalization.CultureInfo currentCulture = System.Globalization.CultureInfo.CurrentCulture;
try
{
foreach (string culture in supportedLanguages)
{
System.Globalization.CultureInfo newCulture = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;
foreach (testEnum e in System.Enum.GetValues(typeof(testEnum)))
{
if (reader.Value.ToString() == GetDisplayName(e))
{
return e;
}
}
}
}
finally
{
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;
}
Изменение культуры потоков вперед и назад не кажется хорошей идеей, но, может быть, это единственный вариант, открытый для меня? У кого-нибудь есть идея получше?
Приложение - приложение MVC asp.net, где я использую web.config
<globalization uiCulture="en" culture="en-US" fileEncoding="utf-8" />
для установки текущего языка, который считывает значения из файла Resx. Примерное перечисление:
public enum PriorityEnum
{
[Display(Name = "Unknown", ResourceType = typeof(RootResource))]
Unknown,
[Display(Name = "Minor", ResourceType = typeof(RootResource))]
Minor,
[Display(Name = "Moderate", ResourceType = typeof(RootResource))]
Moderate,
[Display(Name = "Severe", ResourceType = typeof(RootResource))]
Severe,
[Display(Name = "Extreme", ResourceType = typeof(RootResource))]
Extreme
}