繁体   English   中英

C# 索引器属性 - 有什么方法可以虚拟化 get 而不是 set 方法?

[英]C# Indexer properties - Any way to virtualize the get and not the set method?

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

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

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

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

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

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

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

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

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

我可能会误解一些东西,但是如果您的Dictionary只读的,您必须实现一个包装器以确保它真的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;
        }
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM