एक .resx फ़ाइल में सभी संसाधनों के माध्यम से लूप


125

क्या .resxC # में फ़ाइल में सभी संसाधनों के माध्यम से लूप करने का कोई तरीका है ?


2
क्या आप इस बारे में विस्तार से बता सकते हैं कि RESX फ़ाइल आपके प्रोजेक्ट के लिए आंतरिक है या आप चाहते हैं (या आवश्यकता है) एक अलग RESX फ़ाइल पढ़ें या किसी अन्य असेंबली से RESX पढ़ें?
हाबिल

जवाबों:


243

आपको हमेशा संसाधन प्रबंधक का उपयोग करना चाहिए और वैश्वीकरण को ध्यान में रखना सुनिश्चित करने के लिए फ़ाइलों को सीधे नहीं पढ़ना चाहिए।

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;
}

12
मुझे यह पता लगाने में थोड़ा समय लगा कि आपको MyResourceClass घोषित करने के लिए इस लाइन की आवश्यकता है। ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
जोफलेट

6
@JoeFletch: यह इस लाइन की जरूरत नहीं है। कोड संसाधन फ़ाइल को सीधे कॉल करता है। उदाहरण: मेरे पास PageList.resx नाम की एक फ़ाइल है, फिर मैं कॉल करूंगा: ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet (CultureInfo.CurrentUICulture, true, true);
गेब्रियल

@ गैब्रिएल, अपडेट के लिए धन्यवाद! मुझे इसे देखने के लिए अपने कोड पर वापस जाना होगा।
जोफलेट

3
जोफलेट की लाइन ने वास्तव में मेरी मदद की। मेरे पास एक और C # प्रोजेक्ट में स्थित एक रेक्स था, इसलिए उनकी लाइन ने मुझे उस dll असेंबली को कॉल करने और संसाधनों के रास्ते में लोड करने की अनुमति दी। इसके अलावा, जब मैंने अपने कोड में पेजलिस्ट को शामिल करने की कोशिश की, तो इसने पेजलिस्ट के लिए एक त्रुटि फेंक दी। RourceourceManager .. यह कहते हुए कि "पेजलिस्ट में रिसोर्स मैनजर के लिए परिभाषा नहीं है"। और अंत में, स्ट्रिंग रिसोर्सकेय = एंट्री।केवी ने एक एरर फेंक दी, मैंने इसके बजाय "ऑब्जेक्ट रिसोर्सकेय = एंट्री।केय" का उपयोग किया
स्कैसलज

2
यदि आपके पास वास्तव में आपके संसाधन में परिभाषित संस्कृतियां हैं, तो आपको संस्कृतिइन्फो पर स्विच करना होगा। InvariantCulture। यहां मैं एक लाइब्रेरी में संसाधनों का उपयोग कर रहा था, न कि एक WinForms ऐप।
इजराइल लोपेज

26

मेरे ब्लॉग पर इसके बारे में ब्लॉग किया गया :) संसाधनों का पूरा नाम खोजने के लिए लघु संस्करण है (जब तक कि आप उन्हें पहले से ही नहीं जानते):

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कक्षा के कुछ अन्य स्थिर तरीकों का उपयोग करके एक अलग असेंबली ऑब्जेक्ट मिलेगा । आशा करता हूँ की ये काम करेगा :)


क्या आप संसाधन 'संसाधन' नामक फ़ोल्डर में स्थित संसाधनों की गणना नहीं कर सकते हैं ? मैं अपने प्रोजेक्ट में स्थित सभी संसाधन छवियों को 'इमेज' नामक फ़ोल्डर में सम्‍मिलित करना चाहूंगा।
साइमन बोसले

बहुत यकीन है कि यह परवाह नहीं है कि यह कहाँ स्थित है? झसे आज़माओ?
शविश

1
मेरे पास sql फ़ाइलों को इनपोर्ट करने के लिए एक फ़ोल्डर में फाइलें थीं और यह पूरी तरह से काम करती थी। मैंने स्ट्रीम से स्ट्रिंग में रूपांतरण जोड़ा ताकि मैं फ़ाइल पढ़ सकूं और कोई समस्या न हो।
ErocM

9

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());
}

7
  // 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 उदाहरण


4
ध्यान दें कि यह वर्ग System.Windows.Formsअसेंबली में है और स्वचालित रूप से जोड़ा नहीं जाता है यदि आप MVC ऐप का उपयोग कर रहे हैं
Rob Scott

6

जिस मिनट में आप अपनी परियोजना में एक संसाधन .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 फ़ाइल वर्तमान विधानसभा या परियोजना के दायरे में है। अन्यथा, "पल्स" द्वारा प्रदान की गई विधि का उपयोग करें।

इस पद्धति का लाभ यह है कि आप वास्तविक संपत्तियों को कॉल करते हैं जो आपके लिए प्रदान की गई हैं, यदि आप चाहें तो किसी भी स्थानीयकरण को ध्यान में रखें। हालाँकि, यह बेमानी है, क्योंकि आम तौर पर आपको अपने संसाधनों के गुणों को कॉल करने के सुरक्षित प्रकार का उपयोग करना चाहिए।


2
जब रिसोर्ससेट उपलब्ध हो तो प्रतिबिंब का उपयोग क्यों करें?
ओडलेस

यही कारण है कि मुझे आश्चर्य होगा (अंतिम पैराग्राफ देखें)। बस एक वैकल्पिक तरीका दिखाना चाहते थे, लेकिन इससे भी महत्वपूर्ण बात, यह दिखाना चाहते थे कि वर्ग पूरी तरह से सुलभ है और आपको हाथ से कोई जादू करने की आवश्यकता नहीं है (पहला पैराग्राफ)।
हाबिल


1

यदि आप 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);
}

1

नगेट पैकेज 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;
   }
}


0

सरल रीड लूप इस कोड का उपयोग करते हैं

var resx = ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, false, false);

foreach (DictionaryEntry dictionaryEntry in resx)
{
    Console.WriteLine("Key: " + dictionaryEntry.Key);
    Console.WriteLine("Val: " + dictionaryEntry.Value);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.