为linq用法公开字典setter属性

时间:2014-10-24 19:16:54

标签: c# linq reflection dictionary

我有一些使用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;
    }
}

1 个答案:

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