有没有一种简单的方法可以创建一个不能添加但可以修改其值的类似字典的对象?

Is there an easy way to have a dictionary-like object that cannot be added to, but whose values can be modified?

假设我有一个 class Composite 是根据乐器和权重的字典构造的。

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

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

}

这个class是暴露给客户端的,我希望客户端能够修改Underlyings内已有的键值,但不能向[=添加新的键值对12=]。

然后将 Underlyings 设为 ReadOnlyDictionary 将不起作用,因为客户端代码将无法修改现有键的值。所以我的解决方案是从 this answer 获取字典的包装器并修改 TValue IDictionary<TKey, TValue>.this[TKey key] 的 setter 以便可以修改现有值。但这似乎是一个愚蠢的解决方案 - 有没有比编写包装器 class 更简单的方法来拥有一个具有可修改的现有键值对但不能添加新键值对的字典?为这个非常简单的问题道歉。

不,没有只允许更新的标准词典。全有或全无。

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

如您所说,在字典上创建包装器或从字典继承 class 重写添加。

这不是一个好方法,而是一个 hack。 围绕您的数据生成包装器并使用 .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

您可以使用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;