Pasa por todos los recursos en un archivo .resx

¿Hay alguna manera de recorrer todos los recursos en un archivo .resx en C #?

Siempre debe usar el administrador de recursos y no leer archivos directamente para asegurarse de que se tenga en cuenta la globalización.

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

Blogéo sobre esto en mi blog 🙂 La versión corta es, para encontrar los nombres completos de los recursos (a menos que ya los conozca):

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

Para usarlos todos por algo:

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

Para usar recursos en otros ensambles que no sean el ejecutable, obtendría un objeto de ensamblaje diferente al usar algunos de los otros métodos estáticos de la clase Assembly . Espero eso ayude 🙂

Usar la clase 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(); 

ver enlace: ejemplo de microsoft

En el momento en que agrega un archivo .RESX de recursos a su proyecto, Visual Studio creará un Designer.cs con el mismo nombre, creando una clase para usted con todos los elementos del recurso como propiedades estáticas. Puede ver todos los nombres del recurso cuando escribe el punto en el editor después de escribir el nombre del archivo de recursos.

Alternativamente, puede usar la reflexión para recorrer estos nombres.

 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 } 

Este método obviamente solo se puede usar cuando el archivo RESX está en el scope del ensamblaje o proyecto actual. De lo contrario, use el método proporcionado por “pulso”.

La ventaja de este método es que usted llama a las propiedades reales que se le han proporcionado, teniendo en cuenta cualquier localización, si lo desea. Sin embargo, es bastante redundante, ya que normalmente debería utilizar el método tipo safe direct para llamar a las propiedades de sus recursos.

Puede usar ResourceManager.GetResourceSet .

Si desea usar LINQ, use resourceSet.OfType() . El uso de LINQ le permite, por ejemplo, seleccionar recursos basados ​​en su índice (int) en lugar de la clave (cadena):

 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 el paquete nuget System.Resources.ResourceManager (v4.3.0), ResourceSet y ResourceManager.GetResourceSet no están disponibles.

Uso de ResourceReader , ya que esta publicación sugiere: ” C # – No se puede obtener una cadena de ResourceManager (del conjunto de satélites) ”

Todavía es posible leer las claves / valores del archivo de recursos.

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

Usando LINQ to SQL :

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