একটি .resx ফাইলে সমস্ত সংস্থান থেকে লুপ করুন


124

.resxসি # তে কোনও ফাইলের সমস্ত সংস্থান থেকে লুপ করার কোনও উপায় আছে কি ?


2
RESX ফাইলটি আপনার প্রকল্পের অভ্যন্তরীণ কিনা বা আপনি কোনও পৃথক RESX ফাইল পড়তে চান (বা প্রয়োজন) অন্য সমাবেশ থেকে RESX পড়তে চান কিনা সে বিষয়ে আপনি বিশদ বর্ণনা করতে পারেন?
আবেল

উত্তর:


242

বিশ্বায়নকে বিবেচনায় নেওয়া হয়েছে তা নিশ্চিত করার জন্য আপনার সর্বদা রিসোর্স ম্যানেজার ব্যবহার করা উচিত এবং সরাসরি ফাইলগুলি পড়া উচিত নয়।

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
আমার মাই রিসোর্সক্লাস ঘোষণার জন্য আপনার এই লাইনটি দরকার তা নির্ধারণ করতে আমাকে একটু সময় লাগল। ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
জোফ্লেচ

6
@ জোফ্লেচ: এটির এই লাইনের দরকার নেই। কোডটি সরাসরি রিসোর্স ফাইলকে কল করে। উদাহরণ: আমার কাছে পেজলিস্ট.রেক্স নামে একটি ফাইল রয়েছে, তারপরে আমি কল করব: রিসোর্সসেট রিসোর্সসেট = পেজলিস্ট es রিসোর্স ম্যানেজার.গেটআরসোর্সেসেট (সংস্কৃতিআইনফোর.কেনরানউইকিউক্রিট, সত্য, সত্য);
গ্যাব্রিয়েল

@ গ্যাব্রিয়েল, আপডেটের জন্য ধন্যবাদ! এটি পরীক্ষা করার জন্য আমাকে আমার কোডে ফিরে যেতে হবে।
জোফ্লেচ

3
জোফ্লেচের লাইনটি আসলে আমাকে সাহায্য করেছিল। আমি অন্য একটি সি # প্রকল্পে অবস্থিত একটি রেসেক্স রেখেছি, সুতরাং তার লাইনটি আমাকে সেই ডিএল অ্যাসেমব্লিকে কল করার অনুমতি দেয় এবং সেইভাবে সংস্থানগুলিতে লোড করতে পারে। এছাড়াও, যখন আমি আমার কোডে পেজলিস্টটি অন্তর্ভুক্ত করার চেষ্টা করেছি তখন এটি পেজলিস্টের জন্য একটি ত্রুটি ছুঁড়ে দিয়েছে es রিসোর্স ম্যানেজার .. "পেজলিস্টে রিসোর্স ম্যানেজারের সংজ্ঞা নেই"। এবং পরিশেষে, স্ট্রিং রিসোর্সকি = এন্ট্রি। কী একটি ত্রুটি ছুঁড়েছে, আমি তার পরিবর্তে "অবজেক্ট রিসোর্সকি = এন্ট্রি.কি" ব্যবহার করেছি
স্কাল্লাজ

2
আপনার সংস্থানগুলিতে প্রকৃত সংস্কৃতি সংজ্ঞায়িত করা আছে তার উপর নির্ভর করে আপনাকে সংস্কৃতিআইএনফোর.ইনভারিয়ান্টকালচারে স্যুইচ করতে হবে। এখানে আমি উইন্ডোয়ার্স অ্যাপ্লিকেশন নয়, একটি লাইব্রেরিতে সংস্থান ব্যবহার করছিলাম।
ইস্রায়েল লোপেজ 18

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ক্লাসের অন্যান্য স্থিতিশীল কিছু পদ্ধতি ব্যবহার করে একটি আলাদা সমাবেশ অবজেক্ট পাবেন । আশা করি এটা সাহায্য করবে :)


আপনি সেই সমস্ত সম্পদের গনা পারি না একটি ফোল্ডার 'রিসোর্স' বলা অবস্থিত? আমি আমার প্রকল্পে অবস্থিত সমস্ত রিসোর্স চিত্রগুলি 'ইমেজস' নামে একটি ফোল্ডারে গণনা করতে চাই।
সাইমন বোসলে

খুব নিশ্চিত যে এটি কোথায় অবস্থিত তা সম্পর্কে চিন্তা করে না? এটা পরীক্ষা করো?
Svish

1
এসকিউএল ফাইলগুলি ইনপোর্ট করার জন্য আমার একটি ফোল্ডারে ফাইল ছিল এবং এটি পুরোপুরি কার্যকর হয়েছিল। আমি স্ট্রিম থেকে স্ট্রিংতে রূপান্তর যুক্ত করেছি যাতে আমি ফাইলটি পড়তে পারি এবং এতে কোনও সমস্যা ছিল না।
এরোকএম


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

লিঙ্ক দেখুন: মাইক্রোসফ্ট উদাহরণ


4
নোট করুন যে এই শ্রেণিটি System.Windows.Formsসমাবেশে রয়েছে এবং আপনি যদি এমভিসি অ্যাপ্লিকেশন ব্যবহার করেন তবে স্বয়ংক্রিয়ভাবে যুক্ত হয় না
রব স্কট

6

আপনি আপনার প্রকল্পে কোনও রিসোর্স .আরএসএক্স ফাইল যুক্ত করার মুহুর্তে ভিজ্যুয়াল স্টুডিও একই নামে একটি ডিজাইনার সি তৈরি করবে, আপনার জন্য সম্পদের সমস্ত আইটেমের সাথে স্ট্যাটিক বৈশিষ্ট্য হিসাবে এ ক্লাস তৈরি করবে। আপনি যখন রিসোর্স ফাইলটির নাম টাইপ করার পরে সম্পাদকটিতে বিন্দুটি টাইপ করেন তখন আপনি সংস্থানটির সমস্ত নাম দেখতে পাবেন।

বিকল্পভাবে, আপনি এই নামের মাধ্যমে লুপ প্রতিবিম্ব ব্যবহার করতে পারেন।

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

আপনি যদি লিনকিউ ব্যবহার করতে চান তবে ব্যবহার করুন resourceSet.OfType<DictionaryEntry>()। লিনকিউ ব্যবহার করা আপনাকে উদাহরণস্বরূপ, কী (স্ট্রিং) এর পরিবর্তে তাদের সূচক (ইনট) এর ভিত্তিতে সংস্থানগুলি নির্বাচন করতে দেয়:

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এই পোস্টটি যেমনটি ব্যবহার করে , তেমন ব্যবহার করে : " সি # - রিসোর্স ম্যানেজারের (উপগ্রহ সমাবেশ থেকে) স্ট্রিং পাওয়া যায় না "

রিসোর্স ফাইলের কী / মানগুলি পড়া এখনও সম্ভব।

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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.