Відповіді:
Ви завжди повинні використовувати менеджер ресурсів, а не читати файли безпосередньо, щоб забезпечити врахування глобалізації.
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();
див. посилання: приклад мікрософт
System.Windows.Forms
і не додається автоматично, якщо ви використовуєте додаток MVC
Після того, як ви додасте файл .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 знаходиться в межах поточної збірки або проекту. В іншому випадку використовуйте метод, передбачений "імпульсом".
Перевага цього методу полягає в тому, що ви називаєте фактичні властивості, які були надані вам, беручи до уваги будь-яку локалізацію, якщо бажаєте. Однак це є надлишковим, оскільки зазвичай слід використовувати безпечний прямий метод виклику властивостей своїх ресурсів.
Ви можете використовувати 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);
}
З пакетом 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 для 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);
}