为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;
    }
}

为linq用法公开dictionary setter属性

如果您想实现不区分大小写,那么下面是方法:

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";