Question

Je crée une méthode pour convertir un ENUM à un cordage. Les noms conviviaux sont stockés dans un fichier de ressources et sont soumis à la mondialisation. Donc, j'ai créé deux fichiers de ressources: Enums.resx et Enums.pt-BR.resx dont les clés sont le nom de l'ENUM suivi de la valeur de ce (i.e. DeliveryStatus_WaitingForPayment)

.

Voici le code que je utilise pour charger la ressource et obtenir le nom convivial correspondant au ENUM:

public static string EnumToString<T>(object obj)
{
      string key = String.Empty;

      Type type = typeof(T);

      key += type.Name + "_" + obj.ToString();

      Assembly assembly = Assembly.Load("EnumResources");

      string[] resourceNames = assembly.GetManifestResourceNames();

      ResourceManager = null;

      for(int i = 0; i < resourceNames.Length; i++)
      { 
           if(resourceNames[i].Contains("Enums.resources"))
           {
                rm = new ResourceManager(resourceNames[i], Assembly.GetExecutingAssembly());

                Stream resStream = assembly.GetManifestResourceStream(resourceNames[i]);

                ResourceReader reader = new ResourceReader(resStream);

                IDictionaryEnumerator dict = reader.GetEnumerator();

                while (dict.MoveNext())
                {
                     string keyToCompare = dict.Key.ToString();

                     if (keyToCompare == key)
                         return dict.Value.ToString();
                }
           }

           return obj.ToString();
      }

}

Cette méthode fonctionne presque parfaitement, sauf qu'il ne tient pas compte du CurrentUICulture et retourne toujours les valeurs de la ressource par défaut, qui est, même quand je suis en utilisant pt-BR comme mon CurrentUICulture il charge la valeur de Enum.resx et non Enum.pt-BR.resx.

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Il se trouve que je prenais la mauvaise approche pour lire le fichier de ressources. Non seulement je ne l'ai pas besoin de me frayer un chemin à travers un courant, il me empêchait d'obtenir le résultat sur la base du CurrentUICulture.

La solution est beaucoup plus facile que celle de ma première tentative:

public static string EnumToString<T>(object obj)
{
      string key = String.Empty;

      Type type = typeof(T);

      key += type.Name + "_" + obj.ToString();

      Assembly assembly = Assembly.Load("EnumResources");

      string[] resourceNames = assembly.GetManifestResourceNames();

      ResourceManager = null;

      for(int i = 0; i < resourceNames.Length; i++)
      { 
           if(resourceNames[i].Contains("Enums.resources"))
           {
                //The substring is necessary cause the ResourceManager is already expecting the '.resurces'
                rm = new ResourceManager(resourceNames[i].Substring(0, resourceNames[i].Length - 10), assembly);

                return rm.GetString(key);
           }

           return obj.ToString();
      }

}

J'espère que cela aide quelqu'un d'essayer quelque chose de similaire à l'avenir!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top