6

我有一种特殊类型的字典。我不确定如何准确地做到这一点,但我希望将 get 方法设为虚拟,而不是 set 方法:

    public TValue this[TKey key]
    {
        get { ... }
        set { ... }
    }

有可能吗?如果可以,正确的组合是什么?

4

4 回答 4

14

您不能直接这样做- 您需要添加一个单独的方法:

protected virtual TValue GetValue(TKey key) { ...}

public TValue this[TKey key]
{
    get { return GetValue(key); }
    set { ... }
}
于 2011-07-11T19:53:40.890 回答
6

抱歉...在 C# 中没有执行此操作的语法,但您可以改为执行此操作。

public TValue this[TKey key]
{
   get { return GetValue(key) }
   set { ... }
} 

protected virtual TValue GetValue(TKey key)
{
   ...
}
于 2011-07-11T19:53:51.093 回答
1

我可能会误解某些东西,但是如果您Dictionary只读,则必须实现包装器以确保它确实是只读的(字典的索引属性不是虚拟的,因此您不能覆盖其行为)在这种情况下,您可以执行以下操作:

public class ReadOnlyDictionary<TKey, TValue>
{
    Dictionary<TKey, TValue> innerDictionary;

    public virtual TValue this[TKey key]
    {
        get
        {
            return innerDictionary[key];
        }
        private set
        {
            innerDictionary[key] = value;
        }
    }
}
于 2011-07-11T20:04:00.280 回答
0

我假设您在这里尝试做的是创建一个他们必须定义如何读取属性而不是如何设置属性的情况?

这让我觉得是个坏主意。您可以设置 _myVar 的值,但最终开发人员构建读取 _someOtherVar 的 getter。也就是说,我不知道你的用例是什么,所以很可能我遗漏了一些东西。

无论如何,我认为这个先前的问题可能会有所帮助:为什么不可能覆盖仅 getter 的属性并添加 setter?

于 2011-07-11T20:01:52.427 回答