web-dev-qa-db-fra.com

Boucle à travers toutes les ressources dans un fichier .resx

Existe-t-il un moyen de parcourir toutes les ressources dans un .resx fichier en C #?

123
np.

Vous devez toujours utiliser le gestionnaire de ressources et ne pas lire les fichiers directement pour vous assurer que la globalisation est prise en compte.

using System.Collections;
using System.Globalization;
using System.Resources;

...


        ResourceManager MyResourceClass = new ResourceManager(typeof(Resources /* Reference to your resources class -- may be named differently in your case */));

ResourceSet resourceSet = MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
    string resourceKey = entry.Key.ToString();
    object resource = entry.Value;
}
233
Oundless

Blogué à ce sujet sur mon blog :) La version courte consiste à trouver le nom complet des ressources (à moins que vous ne les connaissiez déjà):

var Assembly = Assembly.GetExecutingAssembly();

foreach (var resourceName in Assembly.GetManifestResourceNames())
    System.Console.WriteLine(resourceName);

Pour tous les utiliser pour quelque chose:

foreach (var resourceName in Assembly.GetManifestResourceNames())
{
    using(var stream = Assembly.GetManifestResourceStream(resourceName))
    {
        // Do something with stream
    }
}

Pour utiliser des ressources dans des assemblys autres que celui en cours d'exécution, vous obtiendrez simplement un objet Assembly différent en utilisant certaines des autres méthodes statiques de la classe Assembly. J'espère que ça aide :)

26
Svish

Utilisez Classe ResXResourceReader

ResXResourceReader rsxr = new ResXResourceReader("your resource file path");

// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
    Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
9
rahul
  // Create a ResXResourceReader for the file items.resx.
  ResXResourceReader rsxr = new ResXResourceReader("items.resx");

  // Create an IDictionaryEnumerator to iterate through the resources.
  IDictionaryEnumerator id = rsxr.GetEnumerator();       

  // Iterate through the resources and display the contents to the console.
  foreach (DictionaryEntry d in rsxr) 
  {
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
  }

 //Close the reader.
 rsxr.Close();

voir le lien: exemple Microsoft

7
logicfalse

Dès que vous ajoutez un fichier de ressource .RESX à votre projet, Visual Studio crée un Designer.cs avec le même nom, créant une classe pour vous avec tous les éléments de la ressource sous forme de propriétés statiques. Vous pouvez voir tous les noms de la ressource lorsque vous tapez le point dans l'éditeur après avoir tapé le nom du fichier de ressource.

Vous pouvez également utiliser la réflexion pour parcourir ces noms.

Type resourceType = Type.GetType("AssemblyName.Resource1");
PropertyInfo[] resourceProps = resourceType.GetProperties(
    BindingFlags.NonPublic | 
    BindingFlags.Static | 
    BindingFlags.GetProperty);

foreach (PropertyInfo info in resourceProps)
{
    string name = info.Name;
    object value = info.GetValue(null, null);  // object can be an image, a string whatever
    // do something with name and value
}

Cette méthode n'est évidemment utilisable que lorsque le fichier RESX est dans la portée de l'assembly ou du projet actuel. Sinon, utilisez la méthode fournie par "Pulse".

L'avantage de cette méthode est que vous appelez les propriétés réelles qui vous ont été fournies, en prenant en compte la localisation éventuelle, si vous le souhaitez. Cependant, il est plutôt redondant, car vous devez normalement utiliser la méthode directe de type safe pour appeler les propriétés de vos ressources.

6
Abel

Vous pouvez utiliser ResourceManager.GetResourceSet .

2
Oded

Si vous voulez utiliser LINQ, utilisez resourceSet.OfType<DictionaryEntry>(). L'utilisation de LINQ vous permet, par exemple, de sélectionner des ressources en fonction de leur index (int) au lieu de key (chaîne):

ResourceSet resourceSet = Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (var entry in resourceSet.OfType<DictionaryEntry>().Select((item, i) => new { Index = i, Key = item.Key, Value = item.Value }))
{
    Console.WriteLine(@"[{0}] {1}", entry.Index, entry.Key);
}
1
Ron Inbar

Avec le paquet de nuget System.Resources.ResourceManager (v4.3.0) les ResourceSet et ResourceManager.GetResourceSet ne sont pas disponibles.

Utilisation de ResourceReader, comme le suggère ce message: " C # - Impossible d’obtenir une chaîne de ResourceManager (de Assembly Satellite) "

Il est toujours possible de lire la clé/les valeurs du fichier de ressources.

System.Reflection.Assembly resourceAssembly = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName("YourAssemblyName"));
String[] manifests = resourceAssembly.GetManifestResourceNames(); 
using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
{
   System.Collections.IDictionaryEnumerator dict = reader.GetEnumerator();
   while (dict.MoveNext())
   {
      String key = dict.Key as String;
      String value = dict.Value as String;
   }
}
1
Jordy

Utilisation de LINQ to SQL :

XDocument
        .Load(resxFileName)
        .Descendants()
        .Where(_ => _.Name == "data")
        .Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
0
Andriy Tolstoy