Parcourir toutes les ressources.fichier resx
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;
}
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 :)
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());
}
// 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
à 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.
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);
}
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;
}
}
utilisant LINQ à SQL :
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");