تحميل مورد ديناميكيًا وقراءة القيمة الصحيحة للزراعة الحالية

StackOverflow https://stackoverflow.com/questions/3125153

سؤال

أقوم بإنشاء طريقة لتحويل التعداد إلى سلسلة ودية. يتم تخزين الأسماء الودية في ملف الموارد وتخضع للعولمة. لذلك قمت بإنشاء ملفين للموارد: enums.resx و enums.pt-br.resx الذي هي مفاتيحها هي اسم التعداد متبوعًا بقيمة ذلك (أي تسليم _waitingforpayment).

هذا هو الرمز الذي أستخدمه لتحميل المورد والحصول على الاسم الصديق المقابل للعضرة:

public static string EnumToString<T>(object obj)
{
      string key = String.Empty;

      Type type = typeof(T);

      key += type.Name + "_" + obj.ToString();

      Assembly assembly = Assembly.Load("EnumResources");

      string[] resourceNames = assembly.GetManifestResourceNames();

      ResourceManager = null;

      for(int i = 0; i < resourceNames.Length; i++)
      { 
           if(resourceNames[i].Contains("Enums.resources"))
           {
                rm = new ResourceManager(resourceNames[i], Assembly.GetExecutingAssembly());

                Stream resStream = assembly.GetManifestResourceStream(resourceNames[i]);

                ResourceReader reader = new ResourceReader(resStream);

                IDictionaryEnumerator dict = reader.GetEnumerator();

                while (dict.MoveNext())
                {
                     string keyToCompare = dict.Key.ToString();

                     if (keyToCompare == key)
                         return dict.Value.ToString();
                }
           }

           return obj.ToString();
      }

}

تعمل هذه الطريقة بشكل مثالي تقريبًا باستثناء أنها تتجاهل الزراعة الحالية وتُرجع دائمًا القيم من المورد الافتراضي ، أي ، حتى عندما أستخدم PT-BR كزحف حالي ، فإنه سيقوم بتحميل القيمة من enum.resx وليس enum.pt -br.resx.

ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

كما اتضح أنني كنت أتبع النهج الخاطئ لقراءة ملف المورد. لم أكن فقط بحاجة إلى العمل في طريقي عبر دفق ، بل كان يمنعني من الحصول على النتيجة استنادًا إلى زراعة الجاري.

الحل أسهل بكثير من محاولتي الأولى:

public static string EnumToString<T>(object obj)
{
      string key = String.Empty;

      Type type = typeof(T);

      key += type.Name + "_" + obj.ToString();

      Assembly assembly = Assembly.Load("EnumResources");

      string[] resourceNames = assembly.GetManifestResourceNames();

      ResourceManager = null;

      for(int i = 0; i < resourceNames.Length; i++)
      { 
           if(resourceNames[i].Contains("Enums.resources"))
           {
                //The substring is necessary cause the ResourceManager is already expecting the '.resurces'
                rm = new ResourceManager(resourceNames[i].Substring(0, resourceNames[i].Length - 10), assembly);

                return rm.GetString(key);
           }

           return obj.ToString();
      }

}

آمل أن يساعد هذا أي شخص يحاول شيئًا مشابهًا في المستقبل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top