Ответы:
Вы всегда должны использовать диспетчер ресурсов и не читать файлы напрямую, чтобы обеспечить учет глобализации.
using System.Collections;
using System.Globalization;
using System.Resources;
...
/* Reference to your resources class -- may be named differently in your case */
ResourceManager MyResourceClass =
new ResourceManager(typeof(Resources));
ResourceSet resourceSet =
MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}
ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
Об этом писал в своем блоге :) Краткая версия, чтобы найти полные названия ресурсов (если вы их еще не знаете):
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
System.Windows.Forms
сборке и не добавляется автоматически, если вы используете приложение MVC
В тот момент, когда вы добавляете файл ресурса .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) вместо ключа (string):
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);
}
В пакете System.Resources.ResourceManager
nuget (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}");
Простой цикл чтения используйте этот код
var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);
foreach (DictionaryEntry dictionaryEntry in resx)
{
Console.WriteLine("Key: " + dictionaryEntry.Key);
Console.WriteLine("Val: " + dictionaryEntry.Value);
}