Câu trả lời:
Bạn phải luôn luôn sử dụng trình quản lý tài nguyên và không đọc các tệp trực tiếp để đảm bảo tính toàn cầu hóa được tính đến.
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"));
Đã viết về nó trên blog của tôi :) Phiên bản ngắn là, để tìm tên đầy đủ của các tài nguyên (trừ khi bạn đã biết chúng):
var assembly = Assembly.GetExecutingAssembly();
foreach (var resourceName in assembly.GetManifestResourceNames())
System.Console.WriteLine(resourceName);
Để sử dụng tất cả chúng cho một cái gì đó:
foreach (var resourceName in assembly.GetManifestResourceNames())
{
using(var stream = assembly.GetManifestResourceStream(resourceName))
{
// Do something with stream
}
}
Để sử dụng tài nguyên trong các tập hợp khác ngoài tập hợp thực thi, bạn chỉ cần lấy một đối tượng lắp ráp khác bằng cách sử dụng một số phương thức tĩnh khác của Assembly
lớp. Hy vọng nó giúp :)
Sử dụng lớp 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();
xem liên kết: ví dụ microsoft
System.Windows.Forms
hội đồng và không được thêm tự động nếu bạn đang sử dụng ứng dụng MVC
Ngay khi bạn thêm tệp .RESX tài nguyên vào dự án của mình, Visual Studio sẽ tạo một Designer.cs có cùng tên, tạo một lớp aa cho bạn với tất cả các mục của tài nguyên dưới dạng các thuộc tính tĩnh. Bạn có thể thấy tất cả các tên của tài nguyên khi bạn nhập dấu chấm vào trình chỉnh sửa sau khi bạn nhập tên của tệp tài nguyên.
Ngoài ra, bạn có thể sử dụng sự phản chiếu để lặp qua các tên này.
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
}
Phương pháp này rõ ràng chỉ có thể sử dụng được khi tệp RESX nằm trong phạm vi của tổ hợp hoặc dự án hiện tại. Mặt khác, sử dụng phương thức được cung cấp bởi "xung".
Ưu điểm của phương pháp này là bạn gọi các thuộc tính thực tế đã được cung cấp cho bạn, có tính đến bất kỳ nội địa hóa nào nếu bạn muốn. Tuy nhiên, nó khá dư thừa, vì thông thường bạn nên sử dụng loại phương thức trực tiếp an toàn để gọi các thuộc tính của tài nguyên của bạn.
Bạn có thể sử dụng ResourceManager.GetResourceset .
Nếu bạn muốn sử dụng LINQ, hãy sử dụng resourceSet.OfType<DictionaryEntry>()
. Ví dụ, sử dụng LINQ cho phép bạn chọn tài nguyên dựa trên chỉ mục (int) của chúng thay vì khóa (chuỗi):
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);
}
Với gói System.Resources.ResourceManager
nuget (v4.3.0), ResourceSet
và ResourceManager.GetResourceSet
không có sẵn.
Sử dụng ResourceReader
, như bài đăng này đề xuất: " C # - Không thể nhận chuỗi từ ResourceManager (từ lắp ráp vệ tinh) "
Vẫn có thể đọc khóa / giá trị của tệp tài nguyên.
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;
}
}
Sử dụng LINQ để SQL :
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
Vòng lặp đọc đơn giản sử dụng mã này
var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);
foreach (DictionaryEntry dictionaryEntry in resx)
{
Console.WriteLine("Key: " + dictionaryEntry.Key);
Console.WriteLine("Val: " + dictionaryEntry.Value);
}