Supposons que nous ayons une énumération :

public enum Foo 
{ 
   [Display(ResourceType = typeof(ModelStrings), Name = "Foo_Bar_Name")]
   Bar,
   [Display(ResourceType = typeof(ModelStrings), Name = "Foo_Far_Name")]
   Far 
}

Et nous avons la ressource ModelStrings avec plusieurs locales.

ModelStrings.en-US.resx, ModelStrings.pt-BR.resx, ModelStrings.fr-FR.resx, etc..

Comment puis-je faire quelque chose comme ça, pour récupérer la valeur des ressources d'une culture spécifique ?

Foo myEnum = Foo.Bar;

var displayName = myEnum.GetDisplayName("pt-BR");
0
MurariAlex 10 nov. 2020 à 18:44

1 réponse

Meilleure réponse

Un peu de réflexion bien fournie comme méthode d'extension sur le type Enum peut faire l'affaire, puisque chaque ressource, par défaut, a une instance statique publique de la classe ResourceManager, responsable de la gestion des ressources.

using System;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Reflection;
using System.Resources;
// ...

public static class EnumExtensions
{ 
     public static string GetDisplayName(this Enum enumValue, string cultureName)
     {
         return GetDisplayName(enumValue, CultureInfo.GetCultureInfo(cultureName ?? CultureInfo.CurrentCulture.Name));
     }

     public static string GetDisplayName(this Enum enumValue, CultureInfo cultureInfo)
     {
         var attribute = enumValue.GetType().GetMember(enumValue.ToString())[0].GetCustomAttribute<DisplayAttribute>();

         var resourceType = attribute.ResourceType;
         var resourceKey = attribute.Name;

         var resourceManagerMethodInfo = resourceType.GetProperty(nameof(ResourceManager), BindingFlags.Public | BindingFlags.Static);

         var resourceManager = (ResourceManager)resourceManagerMethodInfo?.GetValue(null);

         return resourceManager?.GetString(resourceKey, cultureInfo);
     }
 }

Donc, nous pouvons simplement l'utiliser comme ceci:

Foo myEnum = Foo.Bar;

var displayName = myEnum.GetDisplayName("pt-BR"); // The extension method.

Testé sur .NET Core 3.1

0
MurariAlex 10 nov. 2020 à 15:44