Existe-t-il un moyen de parcourir toutes les ressources dans un .resx
fichier en C #?
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;
}
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 :)
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());
}
// 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
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.
Vous pouvez utiliser ResourceManager.GetResourceSet .
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);
}
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;
}
}
Utilisation de LINQ to SQL :
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");