Có cách nào để lặp qua tất cả các tài nguyên trong tệp .resx
trong C# không?Lặp qua tất cả các tài nguyên trong một tệp .resx
Trả lời
Bạn nên luôn sử dụng trình quản lý tài nguyên và không đọ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;
...
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;
}
Nó đã cho tôi một chút để tìm ra rằng bạn cần dòng này để khai báo MyResourceClass. 'ResourceManager MyResourceClass = new ResourceManager (" Resources.ResourceFileName ", System.Reflection.Assembly.Load (" App_GlobalResources "));' – JoeFletch
@JoeFletch: nó không cần dòng này. Mã này gọi trực tiếp tệp tài nguyên. Ví dụ: tôi có một tệp có tên PageList.resx, sau đó tôi sẽ gọi: ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet (CultureInfo.CurrentUICulture, đúng, đúng); – Gabriel
@Gabriel, cảm ơn bạn đã cập nhật! Tôi sẽ phải quay lại mã của tôi để kiểm tra điều này. – JoeFletch
Sử dụng ResXResourceReader Class
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());
}
Bạn có thể sử dụng ResourceManager.GetResourceSet.
viết blog về nó on my blog :) phiên bản ngắn là, để tìm ra tên đầy đủ của các nguồn 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ả trong số họ 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 hội đồng khác so với thực thi, bạn chỉ cần có đối tượng lắp ráp khác bằng cách sử dụng một số phương pháp tĩnh khác của lớp Assembly
. Hy vọng nó giúp :)
Bạn có thể liệt kê tài nguyên * không * nằm trong một thư mục có tên 'Tài nguyên' không? Tôi muốn liệt kê tất cả các hình ảnh tài nguyên nằm trong dự án của tôi trong một thư mục có tên là 'Hình ảnh'. –
Khá chắc chắn nó không quan tâm về vị trí của nó? Kiểm tra nó? – Svish
Tôi đã có các tệp trong một thư mục để nhập tệp sql và điều này hoạt động hoàn hảo. Tôi đã thêm chuyển đổi từ luồng thành chuỗi nên tôi có thể đọc tệp và không có vấn đề gì. – ErocM
Phút bạn thêm tệp .RESX vào dự án của bạn, Visual Studio sẽ tạo một Designer.cs có cùng tên, tạo 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 thuộc tính tĩnh . Bạn có thể xem tất cả tên của tài nguyên khi bạn nhập dấu chấm trong trình chỉnh sửa sau khi bạn nhập tên của tệp tài nguyên.
Hoặc, bạn có thể sử dụng 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 khi tệp RESX nằm trong phạm vi của hội đồng hoặc dự án hiện tại. Nếu không, hãy 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ó là khá dư thừa, như thường lệ, bạn nên sử dụng loại phương pháp 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.
Tại sao phải sử dụng sự phản chiếu khi có sẵn một ResourceSet? –
Đó là những gì tôi tự hỏi là tốt (xem đoạn cuối). Chỉ muốn thể hiện một phương pháp thay thế, nhưng quan trọng hơn, muốn cho thấy rằng lớp học được thực hiện hoàn toàn có thể truy cập được và bạn không cần thực hiện bất kỳ phép thuật nào bằng tay (đoạn đầu tiên). – Abel
// 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: microsoft example
Lưu ý rằng lớp này nằm trong tập hợp 'System.Windows.Forms' và không tự động được thêm nếu bạn đang sử dụng ứng dụng MVC –
Sử dụng LINQ to SQL:
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");
Nếu bạn muốn sử dụng LINQ, sử dụng resourceSet.OfType<DictionaryEntry>()
. Sử dụng LINQ cho phép bạn, ví dụ, để chọn tài nguyên dựa trên chỉ mục của họ (int) 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);
}
- 1. Lặp qua tất cả các Tài nguyên trong ResourceManager - C#
- 2. Tệp tài nguyên (RESX) đã bị lỗi
- 3. Sử dụng các tệp tài nguyên (.resx) trong javascript
- 4. Tệp tài nguyên (.resx) Tệp quy ước đặt tên khóa?
- 5. Tìm tất cả các tài nguyên được nhúng trong một assembly khác
- 6. Liệt kê tất cả các tài nguyên được nhúng trong một thư mục
- 7. Lợi ích của tệp tài nguyên (.resx) là gì?
- 8. Tải xuống một trang web và tất cả các tệp tài nguyên trong Python
- 9. Truy cập các tệp tài nguyên resx từ một dự án khác
- 10. lặp qua tất cả các thư mục trong một tệp zip java
- 11. Tìm tài nguyên cục bộ bị thiếu trong các tệp resx
- 12. lua: lặp qua tất cả các cặp trong bảng
- 13. Lặp qua tất cả các ô trong UICollectionView
- 14. lặp qua tất cả các ô trong UICollectionview
- 15. Lặp qua tất cả các tệp trong thư mục trong R, áp dụng nhiều lệnh
- 16. Không thể truy cập tài nguyên trong một JAR trên tất cả các máy tính
- 17. Làm cách nào để lặp qua tất cả các phương thức của một lớp trong Perl?
- 18. Django, lặp qua tất cả các lỗi biểu mẫu
- 19. Truy cập tài nguyên của biểu mẫu (tệp resx) từ mã
- 20. Làm cách nào để đưa tất cả tài nguyên vào một tệp html?
- 21. Có thể xác định mảng chuỗi trong tệp tài nguyên .resx không?
- 22. Lặp qua các tài liệu trong MongoDB
- 23. Javascript-HTML - cách lặp qua tất cả các biểu mẫu trên một trang?
- 24. Làm cách nào để lặp qua tất cả các dòng tệp được truyền trên dòng lệnh?
- 25. lặp qua tất cả các biến thành viên của một lớp trong python
- 26. Mục tiêu- C - Lặp qua tất cả các thuộc tính trong một lớp?
- 27. Lặp qua TẤT CẢ các tệp trong một thư mục dựa trên 'Ngày sửa đổi lần cuối'
- 28. Làm thế nào để lặp qua tất cả các bảng trong MS Access DB
- 29. Java có tương đương với tệp tài nguyên .NET (.resx) để bản địa hóa không?
- 30. Cập nhật tệp tài nguyên động
Bạn có thể giải thích xem tệp RESX có nằm trong dự án của bạn hay bạn muốn (hoặc cần phải) đọc một tệp RESX riêng biệt hoặc đọc RESX từ một hội đồng khác? – Abel