我正在使用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
答案 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"]);
}