जवाबों:
आपको हमेशा संसाधन प्रबंधक का उपयोग करना चाहिए और वैश्वीकरण को ध्यान में रखना सुनिश्चित करने के लिए फ़ाइलों को सीधे नहीं पढ़ना चाहिए।
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 फ़ाइल जोड़ते हैं, विज़ुअल स्टूडियो उसी नाम से एक डिज़ाइनर बना देगा। आपके लिए संसाधन के सभी आइटमों के साथ स्थिर गुण के रूप में ए क्लास तैयार करना होगा। संसाधन का नाम टाइप करने के बाद आप संपादक में डॉट टाइप करते समय संसाधन के सभी नाम देख सकते हैं।
वैकल्पिक रूप से, आप इन नामों के माध्यम से लूप में प्रतिबिंब का उपयोग कर सकते हैं।
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);
}
नगेट पैकेज System.Resources.ResourceManager
(v4.3.0) ResourceSet
और के साथResourceManager.GetResourceSet
उपलब्ध नहीं हैं।
ResourceReader
इस पद का उपयोग करते हुए , जैसा कि सुझाव दिया गया है: " C # - संसाधन प्रबंधक (सैटेलाइट असेंबली से) को स्ट्रिंग नहीं मिल सकता है " "
संसाधन फ़ाइल की कुंजी / मान पढ़ना अभी भी संभव है।
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);
}