Используйте ResourceReader для создания HybridDictionary ресурсов - PullRequest
2 голосов
/ 22 апреля 2009

Я использую ResourceReader для чтения встроенного ресурса resx и хочу сохранить его на уровне класса в переменной-члене. Я хочу сохранить его как HybridDictionary, но не вижу простого способа сделать это.

Ученик

private IEnumerable<DictionaryEntry> dictionary;

Класс инициализации

Assembly asm = Assembly.GetExecutingAssembly();
Stream resourceStream = asm.GetManifestResourceStream("MagicBeans");

using (ResourceReader r = new ResourceReader(resourceStream))
{
    IEnumerable<DictionaryEntry> dictionary = r.OfType<DictionaryEntry>();
}

Свойства

public string Something { get { return dictionary["Something"].Value;  }} 
public string ThatThing { get { return dictionary["ThatThing"].Value;  }} 

Тем не менее, IEnumerable<DictionaryEntry> работает не так, как мне нравится, и я в настоящее время смотрю на то, чтобы делать что-то вроде LINQ'y; .First(x => x.Key=="Something").Value

Ответы [ 2 ]

3 голосов
/ 22 апреля 2009

IEnumerable не поддерживает доступ по ключу (словарь ["что-то") в вашем коде) для доступа к данным таким образом, что вам необходимо, чтобы свойство словаря было классом IDictionary. Что-то вроде:

private IDictionary<string, object> dictionary;

Тогда вам нужно будет проанализировать данные, которые вы извлекаете из сборки, чтобы заполнить словарь:

Assembly asm = Assembly.GetExecutingAssembly();
Stream resourceStream = asm.GetManifestResourceStream("MagicBeans");

dictionary = new Dictionary<string, object>();

using (ResourceReader r = new ResourceReader(resourceStream))
{
    foreach(DictionaryEntry entry in r.OfType<DictionaryEntry>())
    {
       dictionary.Add(entry.Key.ToString(), entry.Value);
    }
}

Наконец, свойства не нуждаются в вызове Value:

public string Something { get { return dictionary["Something"];  }} 
public string ThatThing { get { return dictionary["ThatThing"];  }}

Эти свойства будут вызывать исключение, если ключ отсутствует в словаре, поэтому вы можете сначала проверить это.

Ваше решение LINQ также должно работать, но за счет перечисления списка для поиска правильной записи при каждом запросе свойства.

0 голосов
/ 01 июня 2009

Чтобы преобразовать ресурс в словарь, вы можете использовать следующее:

using (var reader = new ResourceReader(resource))
{
  var dictionary = reader
    .Cast<DictionaryEntry>()
    .Aggregate(new Dictionary<string, object>(), (d, e) => { d.Add(e.Key.ToString(), e.Value); return d; });

  Console.WriteLine(dictionary["Foo"]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...