¿Hay alguna manera de recorrer todos los recursos en un .resx
archivo en C #?
¿Hay alguna manera de recorrer todos los recursos en un .resx
archivo en C #?
Respuestas:
Siempre debe usar el administrador de recursos y no leer los archivos directamente para garantizar que se tenga en cuenta la globalización.
using System.Collections;
using System.Globalization;
using System.Resources;
...
/* Reference to your resources class -- may be named differently in your case */
ResourceManager MyResourceClass =
new ResourceManager(typeof(Resources));
ResourceSet resourceSet =
MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}
ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
Blogueado 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 para algo:
foreach (var resourceName in assembly.GetManifestResourceNames())
{
using(var stream = assembly.GetManifestResourceStream(resourceName))
{
// Do something with stream
}
}
Para usar recursos en ensamblajes distintos al ejecutante, solo obtendría un objeto de ensamblaje diferente utilizando algunos de los otros métodos estáticos de la Assembly
clase. Espero eso ayude :)
Utilice 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
System.Windows.Forms
ensamblado y no se agrega automáticamente si está utilizando una aplicación MVC
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
}
Obviamente, este método solo se puede usar cuando el archivo RESX está dentro del alcance del ensamblaje o proyecto actual. De lo contrario, utilice el método proporcionado por "pulso".
La ventaja de este método es que 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 debe usar el método directo seguro de tipo para llamar a las propiedades de sus recursos.
Puede usar ResourceManager.GetResourceSet .
Si desea usar LINQ, use resourceSet.OfType<DictionaryEntry>()
. El uso de LINQ le permite, por ejemplo, seleccionar recursos en función de su índice (int) en lugar de la clave (cadena):
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);
}
Con el paquete nuget System.Resources.ResourceManager
(v4.3.0) ResourceSet
y ResourceManager.GetResourceSet
no están disponibles.
Usando el ResourceReader
, como sugiere esta publicación: " C # - No se puede obtener una cadena de ResourceManager (del ensamblaje satelital) "
Todavía es posible leer la clave / 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}");
El bucle de lectura simple usa este código
var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);
foreach (DictionaryEntry dictionaryEntry in resx)
{
Console.WriteLine("Key: " + dictionaryEntry.Key);
Console.WriteLine("Val: " + dictionaryEntry.Value);
}