2010-01-11 5 views
111

Gibt es eine Möglichkeit, alle Ressourcen in einer .resx Datei in C# durchlaufen?Schleife durch alle Ressourcen in einer RESX-Datei

+1

Können Sie erarbeiten, ob die RESX-Datei zu einem Projekt intern ist oder ob Sie (oder muss) eine separate RESX-Datei lesen oder RESX von einer anderen Baugruppe lesen? – Abel

Antwort

211

Sie sollten immer den Ressourcenmanager verwenden und Dateien nicht 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; 
} 
+12

Ich brauchte ein wenig um herauszufinden, dass Sie diese Zeile benötigen, um MyResourceClass zu deklarieren. 'ResourceManager MyResourceClass = neuer ResourceManager (" Resources.ResourceFileName ", System.Reflection.Assembly.Load (" App_GlobalResources "));' – JoeFletch

+6

@JoeFletch: Er benötigt diese Zeile nicht. Der Code ruft die Ressourcendatei direkt auf. Beispiel: Ich habe eine Datei namens PageList.resx, dann rufe ich auf: ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet (CultureInfo.CurrentUICulture, wahr, wahr); – Gabriel

+0

@ Gabriel, danke für das Update! Ich werde zu meinem Code zurückgehen müssen, um das zu überprüfen. – JoeFletch

7

Verwenden 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()); 
} 
23

darüber gebloggt on my blog :) Kurzversion ist, die vollständigen Namen der Ressourcen zu finden (es sei denn Sie sie schon kennen):

var assembly = Assembly.GetExecutingAssembly(); 

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

Um alle von ihnen für etwas zu verwenden:

Um Ressourcen in anderen Assemblys als die ausführende zu verwenden, erhalten Sie nur ein anderes Assembly-Objekt, indem Sie einige der anderen statischen Methoden der Klasse Assembly verwenden. Hoffe, es hilft :)

+0

Können Sie Ressourcen * nicht * in einem Ordner namens 'Ressource' aufzählen? Ich möchte alle Ressourcenbilder, die sich in meinem Projekt befinden, in einem Ordner namens "Bilder" auflisten. –

+0

Ziemlich sicher, es ist egal, wo es sich befindet? Probier es aus? – Svish

+1

Ich hatte Dateien in einem Ordner für die Eingabe von SQL-Dateien und das hat perfekt funktioniert. Ich fügte eine Umwandlung von einem Strom zu Schnur hinzu, also konnte ich die Akte lesen und hatte keine Probleme. – ErocM

5

Sobald Sie eine Ressource .RESX-Datei zu Ihrem Projekt hinzufügen, wird Visual Studio eine Designer.cs mit dem gleichen Namen erstellen, erstellen Sie eine Klasse für Sie mit allen Elementen der Ressource als statische 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 Reflektionen verwenden, um diese Namen zu durchlaufen.

Diese Methode ist offensichtlich nur verwendbar, wenn sich die RESX-Datei im Bereich der aktuellen Baugruppe oder des aktuellen Projekts befindet. Andernfalls verwenden Sie die Methode "Impuls".

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

+2

Warum Reflektion verwenden, wenn ein ResourceSet verfügbar ist? –

+0

Das würde ich mich auch fragen (siehe letzten Absatz). Ich wollte nur eine alternative Methode zeigen, aber noch wichtiger, wollte zeigen, dass die Klasse vollständig zugänglich gemacht wird und Sie keine Magie von Hand machen müssen (der erste Absatz). – Abel

7
// 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 example

+3

Beachten Sie, dass sich diese Klasse in der Assembly 'System.Windows.Forms' befindet und nicht automatisch hinzugefügt wird, wenn Sie eine MVC-App verwenden –

0

Mit LINQ to SQL:

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

Wenn Sie LINQ möchten, verwenden resourceSet.OfType<DictionaryEntry>() verwenden. Mit LINQ können Sie zum Beispiel auf Ressourcen zu wählen, basierend auf ihren Index (int) statt Schlüssel (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); 
} 
Verwandte Themen