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

Есть ли способ циклично выполниться через все ресурсы в a .resx файл в C#?

123
задан Ilya 30 September 2016 в 00:28
поделиться

5 ответов

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

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;
}
235
ответ дан 24 November 2019 в 01:12
поделиться

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

2
ответ дан 24 November 2019 в 01:12
поделиться

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

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

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

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

6
ответ дан 24 November 2019 в 01:12
поделиться

Использование Класс ResxResourCereAreader

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());
}
9
ответ дан 24 November 2019 в 01:12
поделиться

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

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

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

26
ответ дан 24 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: