Как я могу перегрузить операторы []? - PullRequest
8 голосов
/ 18 мая 2010

Я создаю класс, который заполняет словарь как частный член. Я хочу раскрыть значения словаря, не раскрывая сам словарь (только для чтения). Я могу легко создать свойство для выставления _dictionary.Keys, но как я могу перегрузить [], чтобы MyClass[key] вернул _dictionary[key] * * 1005

Я думаю, что мне может понадобиться реализовать интерфейс, но я не уверен, какой именно ...

Ответы [ 2 ]

23 голосов
/ 18 мая 2010

Я почти уверен, что это то, что вам нужно:

public TValue this[TKey key] {
    get { return _dictionary[key]; }
}

Если вы хотите реализовать интерфейс для указания клиентскому коду, что ваш класс может быть доступен по индексу типа TKey, наиболее близким соответствием (которое мне известно) является IDictionary<TKey, TValue>.

К сожалению, IDictionary<TKey, TValue> имеет целую группу членов, которые нарушают ваше требование только для чтения, что означает, что вам придется явно реализовывать множество членов только для того, чтобы выдать NotImplementedException (или что-то подобное), когда они вызываются: а именно, установщик для this, Add, Clear и Remove.

Может быть, есть другой интерфейс, который более подходит для этой цели (что-то вроде IReadOnlyDictionary<TKey, TValue>?); Я просто не сталкивался с этим.

Вы также можете написать свой собственный интерфейс, конечно, если вы хотите иметь несколько классов, которые предлагают функциональность, аналогичную этой.

4 голосов
/ 18 мая 2010

Это называется индексатором. Смотри http://msdn.microsoft.com/en-us/library/2549tw02.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...