มีวิธีวนซ้ำทรัพยากรทั้งหมดใน.resx
ไฟล์ใน C # หรือไม่?
มีวิธีวนซ้ำทรัพยากรทั้งหมดใน.resx
ไฟล์ใน C # หรือไม่?
คำตอบ:
คุณควรใช้ตัวจัดการทรัพยากรเสมอและไม่ควรอ่านไฟล์โดยตรงเพื่อให้แน่ใจว่าโลกาภิวัตน์ถูกนำมาพิจารณา
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 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 อยู่ในขอบเขตของแอสเซมบลีหรือโปรเจ็กต์ปัจจุบัน มิฉะนั้นให้ใช้วิธีการ "ชีพจร"
ข้อดีของวิธีนี้คือคุณเรียกคุณสมบัติจริงที่จัดเตรียมไว้ให้คุณโดยคำนึงถึงการแปลเป็นภาษาท้องถิ่นหากคุณต้องการ อย่างไรก็ตามมันค่อนข้างซ้ำซ้อนเนื่องจากโดยปกติคุณควรใช้วิธีการประเภท safe direct ในการเรียกคุณสมบัติของทรัพยากรของคุณ
หากคุณต้องการใช้ 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);
}