Цикл через все ресурсы в файле. resx


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

9 119

9 ответов:

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

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

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

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 класса. Надеюсь, это поможет:)

использовать Класс 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();

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

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

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

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 файл находится в области текущей сборки или проекта. В противном случае используйте метод "пульс".

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

можно использовать ResourceManager.GetResourceSet.

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

С пакетом nuget System.Resources.ResourceManager (v4.3.0) the 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;
   }
}

С помощью LINQ to SQL:

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