Подтвердить что ты не робот

Прокрутите все ресурсы в файле .resx

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

4b9b3361

Ответ 1

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

using System.Collections;
using System.Globalization;
using System.Resources;

...

ResourceSet resourceSet = MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
    string resourceKey = entry.Key.ToString();
    object resource = entry.Value;
}

Ответ 2

О нем в моем блоге. Краткая версия - найти полные имена ресурсов (если вы их уже не знаете):

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

Ответ 3

Используйте класс 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());
}

Ответ 4

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

Ответ 5

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

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

Ответ 7

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

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

Ответ 8

Если вы хотите использовать 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);
}