Перебрать все ресурсы в файле.resx

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

11 ответов

Решение

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

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

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

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

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

Простой цикл чтения используйте этот код

var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);

foreach (DictionaryEntry dictionaryEntry in resx)
{
    Console.WriteLine("Key: " + dictionaryEntry.Key);
    Console.WriteLine("Val: " + dictionaryEntry.Value);
}

С пакетом 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;
   }
}

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

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

Я поместил свой PDF-файл в папку ресурсов для проекта MVC 5 Razor. Вот как я открыл файл:

          public IActionResult ViewCCACH()
    {
        return GetDocumentLikeThis("FORM CC");
    }

    private IActionResult GetDocumentLikeThis(string likeThis)
    {
        ResourceManager MyResourceClass = new ResourceManager(typeof(Resources));

        ResourceSet resourceSet = MyResourceClass.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
        //ResourceManager resourceSet = new ResourceManager("ACH AUTH FORM CC Blank.pdf", System.Reflection.Assembly.Load("App_GlobalResources"));
        foreach (DictionaryEntry entry in resourceSet)
        {
            string resourceKey = entry.Key.ToString();
            object resource = entry.Value;
            if (resourceKey.Contains(likeThis))
            {
                string RunningPath = AppDomain.CurrentDomain.BaseDirectory;
                string FileName = string.Format("{0}Properties\\" + resourceKey + ".pdf", Path.GetFullPath(Path.Combine(RunningPath, @"..\..\..\")));

                var fileStream2 = new FileStream(FileName, FileMode.Open, FileAccess.Read);
                var fsResult2 = new FileStreamResult(fileStream2, "application/pdf");
                return fsResult2;

            }

        }


        return View();
    }

Код в .cshtml был прост:

      <a class="tablinks btn btn-primary m-2 pull-right" href="/Merchant/ViewCCACH" target="_blank">Download File</a>
Другие вопросы по тегам