wake-up-neo.com

Durchlaufen Sie alle Ressourcen in einer RESX-Datei

Gibt es eine Möglichkeit, alle Ressourcen in einem .resx Datei in C #?

123
np.

Sie sollten immer den Ressourcenmanager verwenden und keine Dateien direkt lesen, um sicherzustellen, dass die Globalisierung berücksichtigt wird.

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

Blogged about it in meinem Blog :) Kurzversion ist, um die vollständigen Namen der Ressourcen zu finden (es sei denn, Sie kennen sie bereits):

var Assembly = Assembly.GetExecutingAssembly();

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

Um sie alle für etwas zu benutzen:

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

Wenn Sie Ressourcen in anderen Assemblys als der ausgeführten verwenden möchten, erhalten Sie nur ein anderes Assembly-Objekt, indem Sie einige der anderen statischen Methoden der Klasse Assembly verwenden. Ich hoffe es hilft :)

26
Svish

Verwenden Sie ResXResourceReader Class

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());
}
9
rahul
  // 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();

siehe Link: Microsoft-Beispiel

7
logicfalse

In dem Moment, in dem Sie Ihrem Projekt eine Ressourcen-.RESX-Datei hinzufügen, erstellt Visual Studio eine Designer.cs mit demselben Namen und erstellt eine Klasse für Sie mit allen Elementen der Ressource als statischen Eigenschaften. Sie können alle Namen der Ressource sehen, wenn Sie den Punkt im Editor eingeben, nachdem Sie den Namen der Ressourcendatei eingegeben haben.

Alternativ können Sie Reflection verwenden, um diese Namen zu durchlaufen.

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
}

Diese Methode kann natürlich nur verwendet werden, wenn sich die RESX-Datei im Bereich der aktuellen Assembly oder des aktuellen Projekts befindet. Verwenden Sie andernfalls die von "Pulse" bereitgestellte Methode.

Der Vorteil dieser Methode besteht darin, dass Sie die tatsächlichen Eigenschaften aufrufen, die für Sie bereitgestellt wurden, und dabei die Lokalisierung berücksichtigen, wenn Sie dies wünschen. Es ist jedoch ziemlich redundant, da Sie normalerweise die typsichere direkte Methode zum Aufrufen der Eigenschaften Ihrer Ressourcen verwenden sollten.

6
Abel

Sie können ResourceManager.GetResourceSet verwenden.

2
Oded

Wenn Sie LINQ verwenden möchten, verwenden Sie resourceSet.OfType<DictionaryEntry>(). Mit LINQ können Sie beispielsweise Ressourcen anhand ihres Index (int) anstelle des Schlüssels (string) auswählen:

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);
}
1
Ron Inbar

Mit dem Nuget-Paket System.Resources.ResourceManager (v4.3.0) die ResourceSet und ResourceManager.GetResourceSet sind nicht verfügbar.

Verwenden von ResourceReader, wie in diesem Beitrag vorgeschlagen: " C # - Es kann keine Zeichenfolge vom ResourceManager (von der Satellitenassembly) abgerufen werden "

Es ist weiterhin möglich, die Schlüssel/Werte der Ressourcendatei zu lesen.

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

Verwenden von LINQ to SQL :

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