Динамически загрузка ресурса и чтение правильного значения для текущего количества
-
30-09-2019 - |
Вопрос
Я создаю способ преобразования Enum в дружескую строку. Дружественные имена хранятся в файле ресурсов и подлежат глобализации. Поэтому я создал два ресурса файла ресурсов: enums.resx и enums.pt-br.resx, чьи клавиши - это имя enum, а затем его значение (т.е. доставку).
Это код, который я использую для загрузки ресурса и получить соответствующее дружеское имя для Enum:
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 -БРЭС.
Что я делаю неправильно?
Решение
Как оказывается, я принимал неправильный подход к чтению файла ресурсов. Не только мне не нужно было работать через поток, оно мешало бы мне получить результат на основе текущего количества.
Решение намного проще, чем у моей первой попытки:
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();
}
}
Я надеюсь, что это поможет кому-нибудь попробовать что-то подобное в будущем!