是否有一种简单的方法可以使类似字典的对象无法添加,但可以修改其值?

时间:2016-05-20 09:11:11

标签: c# .net dictionary readonly readonly-collection

假设我有一个类Composite,它是由乐器和权重字典构成的。

public IReadOnlyDictionary<Instrument, double> Underlyings{ get; private set; } 

public Composite(
    Id id,
    Currency currency,
    Dictionary<Instrument, double> underlyings
    )
{
    Underlyings= underlyings;
}

}

此类向客户端公开,我希望客户端能够修改Underlyings中的现有密钥值,但不能将新的键值对添加到Underlyings

然后使Underlyings成为ReadOnlyDictionary将无效,因为客户端代码将无法修改现有密钥的值。所以我的解决方案是将包装器放在this answer的字典周围,并修改TValue IDictionary<TKey, TValue>.this[TKey key]的setter,以便可以修改现有值。但这似乎是一个愚蠢的解决方案 - 是否有一种比编写包装类更简单的方法来拥有一个具有可修改的现有键值对的字典,但不能添加新的键值对?为非常简单的问题道歉。

4 个答案:

答案 0 :(得分:1)

不,没有标准字典只允许更新。它的全部或全部。

正如您所发现的,您必须自己创建它,或者找到已经存在的实现。覆盖Addthis[]属性是一个可能适合您的解决方案。

答案 1 :(得分:1)

您可以使用ReadOnlyDictionary,但提供另一种方法来修改给定键的值。类似的东西:

Dictionary<KeyType, ValueType> _dictionary;
public ReadOnlyDictionary<KeyType, ValueType> Dictionary => new ReadOnlyDictionary<KeyType, ValueType>(_dictionary);

public void ChangeValue(KeyType key, ValueType value) => _dictionary[key].Value = value;

答案 2 :(得分:0)

正如你所说,在字典上创建一个包装器,或者从字典类继承覆盖Add。

答案 3 :(得分:0)

不是一个好方法,而是一个黑客。 生成数据包装器并使用.NET 4.5中引入的ReadOnlyDictionary

class MyDataWrapper<T>
{
    public T Data { set; get; }
}
var dicData = new Dictionary<int, MyDataWrapper<string>>();
dicData[0] = new MyDataWrapper<string> { Data = "0" };
dicData[1] = new MyDataWrapper<string> { Data = "0" };
var myDic = new ReadOnlyDictionary<int, MyDataWrapper<string>>(dic);

myDic[1].Data = "2";

// myDic[1] = new ... compile error
// myDic.Add() compile error