Есть ли способ перебрать все ресурсы в файле .resx
на С#?
Прокрутите все ресурсы в файле .resx
Ответ 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 находится в области текущей сборки или проекта. В противном случае используйте метод "импульс".
Преимущество этого метода заключается в том, что вы вызываете фактические свойства, которые были предоставлены вам, с учетом любой локализации, если хотите. Однако он довольно избыточен, так как обычно вы должны использовать безопасный метод типа прямого вызова свойств ваших ресурсов.
Ответ 6
Вы можете использовать ResourceManager.GetResourceSet.
Ответ 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);
}