使用ResourceReader创建资源的HybridDictionary

时间:2009-04-22 13:20:48

标签: c# linq collections

我正在使用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的事情; .First(x => x.Key=="Something").Value

2 个答案:

答案 0 :(得分:3)

IEnumerable不支持按键访问(代码中的字典[“something”]部分),以便以您需要将字典属性作为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解决方案也应该有效,但是每次请求属性时,都要通过列表枚举来查找正确的条目。

答案 1 :(得分:0)

要将资源转换为字典,您可以使用以下内容:

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"]);
}