Parcourir toutes les ressources.fichier resx

y a-t-il un moyen de passer en boucle toutes les ressources d'un fichier .resx dans C#?

119
demandé sur Ilya 2010-01-11 12:53:56

9 réponses

vous devez toujours utiliser le gestionnaire de ressources et ne pas lire les fichiers directement pour vous assurer que la mondialisation 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;
}
225
répondu Moose Factory 2018-01-19 13:15:00

blogué à ce sujet sur mon blog :) la version courte est, pour trouver les noms complets des ressources(à moins que vous les connaissez déjà):

var assembly = Assembly.GetExecutingAssembly();

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

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 d'autres assemblages que celui d'exécution, vous obtiendriez simplement un objet d'assemblage différent en utilisant certaines des autres méthodes statiques de la classe Assembly . Espérons que cela aide :)

26
répondu Svish 2010-01-11 10:39:39

Utiliser ResXResourceReader Classe

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());
}
7
répondu rahul 2010-01-11 10:00:14
  // 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 lien: exemple microsoft

7
répondu logicfalse 2013-03-27 08:52:18

à la minute où vous ajoutez une ressource .Fichier RESX à votre projet, Visual Studio va créer un concepteur.cs avec le même nom, créant une classe a 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 d'après vous tapez le nom du fichier de ressources.

alternativement, vous pouvez utiliser la réflexion pour boucler à travers 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 est évidemment utilisable uniquement lorsque le fichier RESX est dans le cadre de l'assemblage ou du projet en cours. Sinon, utilisez la méthode fournie par "impulsion".

L'avantage de cette méthode est que vous appelez les propriétés qui ont été prévues pour vous, en tenant compte de la localisation si vous le souhaitez. Cependant, il est plutôt redondant, car normalement vous devriez utiliser la méthode type safe direct pour appeler les propriétés de vos ressources.

5
répondu Abel 2010-01-11 10:09:25

vous pouvez utiliser ResourceManager.GetResourceSet .

2
répondu Oded 2010-01-11 10:01:35

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 la clé (string):

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
répondu Ron Inbar 2017-10-18 14:33:40

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

en utilisant le ResourceReader , comme ce billet suggère: " C# - ne peut pas obtenir une chaîne de la part de ResourceManager (de l'assemblage par satellite)

il est encore possible de lire la clé/les valeurs du fichier ressource.

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
répondu Jordy 2018-07-03 06:45:59

utilisant LINQ à SQL :

XDocument
        .Load(resxFileName)
        .Descendants()
        .Where(_ => _.Name == "data")
        .Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
0
répondu Andriy Tolstoy 2016-07-04 10:22:29