为linq用法公开dictionary setter属性
本文关键字:dictionary setter 属性 linq 用法 | 更新日期: 2023-09-27 18:27:41
我有一些使用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;
}
}
如果您想实现不区分大小写,那么下面是方法:
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";