我有一些使用Dictionary<string, object>
的代码,我需要能够使用linq查询更新此字典中的Value属性,如下所示:
_properties.Where(dicEntry => dicEntry.Key.ToLower() == binder.Name.ToLower()).First().Value = value;
问题是这里的Value
属性只是准备就绪。似乎只能通过索引器设置此Value
,因此_properties["someKey"] = obj
我可以通过反射或其他方式以某种方式公开此setter吗?
编辑:我意识到这可以在没有反思的情况下完成,并且有很多简单的方法可以做到这一点,是的,在大多数解决方案中,反射通常不被认为是理想的,但我主要感兴趣在这种情况下你将如何做我要求的。即我怎样才能使Value不是只读的,让它变得可变。 (覆盖或反思或其他一些手段?)
以下是我想在方法中使用它的代码。
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (_properties.ContainsKey(binder.Name))
{
//here's the old way
//_properties[binder.Name] = value;
//but i'd like to use the below non-compilable code to allow case insensitivity
_properties.Where(dicEntry => dicEntry.Key.ToLower() == binder.Name.ToLower()).First().Value = value;
return true;
}
else
{
return false;
}
}
答案 0 :(得分:1)
如果您想要实现不区分大小写,那么可以采用以下方法:
var caseInsensitiveDictionary = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
或类似于您想要实现的目标:
var dict = new Dictionary<string, string>();
dict.Add("test", "blah");
dict.Add("tesT", "meh");
dict[dict.Keys.Where(k => k.Equals("test", StringComparison.OrdinalIgnoreCase)).First()] = "this";