Есть ли способ циклично выполниться через все ресурсы в a .resx
файл в C#?
Вы всегда должны использовать диспетчер ресурсов и не читать файлы напрямую, чтобы убедиться, что глобализация учитывается.
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;
}
Вы можете использовать ResourceManager.GetResourceSet.
В минуту вы добавляете файл ресурса .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 находится в объеме текущей сборки или проекта. В противном случае используйте метод, предоставляемый «пульс».
Преимущество этого метода заключается в том, что вы вызываете фактические свойства, которые были предоставлены для вас, принимая во внимание любую локализацию, если хотите. Тем не менее, он довольно избыточный, так как обычно следует использовать тип безопасного способа вызова свойств ваших ресурсов.
Использование Класс 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());
}
Это в моем блоге :) Короткие версии, чтобы найти полные имена ресурсов (если вы их уже не знаете):
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
}
}
использовать ресурсы в Другие сборки, чем выполняемая, вы только что получили другой объект сборки, используя некоторые другие статические методы узла
класса. Надеюсь, это поможет :)