131 votes

Parcourir en boucle toutes les ressources d'un fichier .resx

Existe-t-il un moyen de parcourir en boucle toutes les ressources d'une .resx en C# ?

2 votes

Pouvez-vous préciser si le fichier RESX est interne à votre projet ou si vous voulez (ou devez) lire un fichier RESX distinct ou lire le RESX d'une autre assemblée ?

253voto

Moose Factory Points 2075

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;

...

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

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

12 votes

Il m'a fallu un peu de temps pour comprendre que vous avez besoin de cette ligne pour déclarer MyResourceClass. ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));

6 votes

@JoeFletch : cette ligne n'est pas nécessaire. Le code appelle directement le fichier ressource. Exemple : j'ai un fichier nommé PageList.resx, alors je vais appeler : ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true) ;

0 votes

@Gabriel, merci pour la mise à jour ! Je vais devoir retourner à mon code pour vérifier cela.

27voto

Svish Points 32303

J'en ai parlé sur mon blog sur mon blog :) La version courte consiste à trouver les noms complets des ressources (sauf si vous les connaissez déjà) :

var assembly = Assembly.GetExecutingAssembly();

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

Pour les utiliser tous pour quelque chose :

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

Pour utiliser des ressources dans d'autres assemblages que celui qui est en cours d'exécution, il suffit d'obtenir un objet d'assemblage différent en utilisant certaines des autres méthodes statiques de la méthode Assembly classe. J'espère que cela vous aidera :)

0 votes

Pouvez-vous énumérer les ressources no situé dans un dossier appelé "Resource" ? J'aimerais énumérer toutes les images de ressources situées dans mon projet dans un dossier appelé "Images".

0 votes

Je suis sûr qu'il ne se soucie pas de l'endroit où il se trouve ? Vous le testez ?

1 votes

J'avais des fichiers dans un dossier pour importer des fichiers sql et cela a parfaitement fonctionné. J'ai ajouté une conversion d'un flux en chaîne pour pouvoir lire le fichier et je n'ai eu aucun problème.

9voto

rahul Points 84185

Utilice 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());
}

7voto

logicfalse Points 41
  // 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 de microsoft

4 votes

Notez que cette classe se trouve dans le System.Windows.Forms et n'est pas automatiquement ajouté si vous utilisez une application MVC.

7voto

Abel Points 24335

Dès que vous ajoutez un fichier ressource .RESX à votre projet, Visual Studio crée un Designer.cs portant le même nom, en créant une classe pour vous avec tous les éléments de la ressource comme 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 ressource.

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

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'assemblage ou du projet en cours. 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 ont été fournies pour vous, en tenant compte de toute localisation si vous le souhaitez. Cependant, elle est plutôt redondante, car vous devriez normalement utiliser la méthode directe et sûre pour appeler les propriétés de vos ressources.

2 votes

Pourquoi utiliser la réflexion quand il y a un ResourceSet disponible ?

0 votes

C'est ce que je me demande aussi (voir le dernier paragraphe). Je voulais juste montrer une méthode alternative, mais plus important encore, je voulais montrer que la classe est rendue totalement accessible et que vous n'avez pas besoin de faire de la magie à la main (le premier paragraphe).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X