تحميل مورد ديناميكيًا وقراءة القيمة الصحيحة للزراعة الحالية
-
30-09-2019 - |
سؤال
أقوم بإنشاء طريقة لتحويل التعداد إلى سلسلة ودية. يتم تخزين الأسماء الودية في ملف الموارد وتخضع للعولمة. لذلك قمت بإنشاء ملفين للموارد: 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();
}
}
آمل أن يساعد هذا أي شخص يحاول شيئًا مشابهًا في المستقبل!