Passa in rassegna tutte le risorse in un file .resx

C’è un modo per scorrere tutte le risorse in un file .resx in C #?

È necessario utilizzare sempre il gestore risorse e non leggere direttamente i file per garantire che la globalizzazione venga presa in considerazione.

 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; } 

Bloggato sul mio blog 🙂 La versione breve è, per trovare i nomi completi delle risorse (a meno che non le conosci già):

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

Per usarli tutti per qualcosa:

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

Per utilizzare le risorse in altri assembly rispetto a quello in esecuzione, otterresti un object assembly diverso utilizzando alcuni degli altri metodi statici della class Assembly . Spero che sia d’aiuto 🙂

Utilizzare la class 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(); 

vedi link: esempio microsoft

Nel momento in cui aggiungi una risorsa .RESX al tuo progetto, Visual Studio creerà un Designer.cs con lo stesso nome, creando una class per te con tutti gli elementi della risorsa come proprietà statiche. È ansible visualizzare tutti i nomi della risorsa quando si digita il punto nell’editor dopo aver digitato il nome del file di risorse.

In alternativa, è ansible utilizzare la riflessione per scorrere tra questi nomi.

 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 } 

Questo metodo è ovviamente utilizzabile solo quando il file RESX rientra nell’ambito dell’assembly o del progetto corrente. In caso contrario, utilizzare il metodo fornito da “impulso”.

Il vantaggio di questo metodo consiste nel chiamare le proprietà effettive che sono state fornite per te, tenendo conto di eventuali localizzazioni, se lo desideri. Tuttavia, è piuttosto ridondante, in quanto normalmente è necessario utilizzare il metodo safe safe per chiamare le proprietà delle risorse.

È ansible utilizzare ResourceManager.GetResourceSet .

Se si desidera utilizzare LINQ, utilizzare resourceSet.OfType() . L’utilizzo di LINQ consente, ad esempio, di selezionare le risorse in base al loro indice (int) anziché a chiave (stringa):

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

Con il pacchetto nuget System.Resources.ResourceManager (v4.3.0), ResourceSet e ResourceManager.GetResourceSet non sono disponibili.

Utilizzando il ResourceReader , come suggerisce questo post: ” C # – Imansible ottenere una stringa da ResourceManager (da assembly satellite) ”

È ancora ansible leggere la chiave / i valori del file di risorse.

 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; } } 

Utilizzando LINQ to SQL :

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