Перебрать все ресурсы в файле .resx - PullRequest
123 голосов
/ 11 января 2010

Есть ли способ перебрать все ресурсы в файле .resx в C #?

Ответы [ 9 ]

233 голосов
/ 11 января 2010

Вы всегда должны использовать диспетчер ресурсов и не читать файлы напрямую, чтобы обеспечить учет глобализации.

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;
}
26 голосов
/ 11 января 2010

В блоге об этом в моем блоге :) Короткая версия, чтобы найти полные имена ресурсов (если вы их уже не знаете):

var assembly = Assembly.GetExecutingAssembly();

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

Чтобы использовать их все для чего-либо:

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

Чтобы использовать ресурсы в других сборках, отличных от выполняемых, вам нужно просто получить другой объект сборки, используя некоторые другие статические методы класса Assembly. Надеюсь, это поможет:)

9 голосов
/ 11 января 2010

Использование 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());
}
7 голосов
/ 27 марта 2013
  // 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();

см. Ссылку: пример Microsoft

6 голосов
/ 11 января 2010

Как только вы добавите файл ресурса .RESX в свой проект, Visual Studio создаст файл Designer.cs с тем же именем, создав для вас класс со всеми элементами ресурса в качестве статических свойств. Вы можете увидеть все имена ресурсов, когда набираете точку в редакторе после того, как вы набираете имя файла ресурса.

В качестве альтернативы, вы можете использовать отражение, чтобы перебрать эти имена.

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
}

Этот метод, очевидно, применим только в том случае, если файл RESX находится в области действия текущей сборки или проекта. В противном случае используйте метод, предоставленный «пульс».

Преимущество этого метода заключается в том, что вы вызываете фактические свойства, которые были предоставлены для вас, принимая во внимание любую локализацию, если хотите. Тем не менее, это довольно избыточно, так как обычно вы должны использовать безопасный тип прямой метод вызова свойств ваших ресурсов.

2 голосов
/ 11 января 2010

Вы можете использовать ResourceManager.GetResourceSet .

1 голос
/ 03 июля 2018

С пакетом nuget System.Resources.ResourceManager (v4.3.0) ResourceSet и ResourceManager.GetResourceSet недоступны.

Использование ResourceReader, как показано в этом сообщении: " C # - Невозможно получить строку из ResourceManager (из спутниковой сборки) "

Все еще возможно прочитать ключ / значения файла ресурса.

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 голос
/ 18 октября 2017

Если вы хотите использовать LINQ, используйте resourceSet.OfType<DictionaryEntry>(). Использование LINQ позволяет, например, выбирать ресурсы на основе их индекса (int) вместо ключа (строки):

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);
}
0 голосов
/ 04 июля 2016

Использование LINQ to SQL :

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