【问题标题】:C# Indexer properties - Any way to virtualize the get and not the set method?C# 索引器属性 - 有什么方法可以虚拟化 get 而不是 set 方法?
【发布时间】:2011-10-03 02:15:51
【问题描述】:

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

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

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

【问题讨论】:

  • 你想通过只制作getter virtual来实现什么?可能有更好的方法来做到这一点。
  • 只是想扩展我的“ReadOnlyDictionary”。因为它是一个只读字典,所以我不支持 set 方法(抛出异常),但是扩展类可能希望从 get 方法执行额外的工作,因此他们可以覆盖它并修改它。
  • 你不应该尝试使“get”方法成为虚拟方法,而是有一些虚拟的“OnGetCalled”方法并让派生类覆盖它。如果不调用 Base 版本,派生类将无法覆盖“get”(即按照 Mark 的建议),因此单独的方法将使合同明确。

标签: c# dictionary properties virtual indexer


【解决方案1】:

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

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

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

【讨论】:

  • 没关系,我的错。对不起。我想到的解决方案显然使二传手私有化。不过,如果集合是只读的,我看不出问题所在,但它是一个不同的解决方案。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    public class ReadOnlyDictionary<TKey, TValue>
    {
        Dictionary<TKey, TValue> innerDictionary;
    
        public virtual TValue this[TKey key]
        {
            get
            {
                return innerDictionary[key];
            }
            private set
            {
                innerDictionary[key] = value;
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      无论如何,我认为这个先前的问题可能会有所帮助:Why is it impossible to override a getter-only property and add a setter?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 2022-01-04
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        • 2011-07-23
        • 1970-01-01
        相关资源
        最近更新 更多