Возможно ли именованное свойство индексатора? - PullRequest
5 голосов
/ 20 июля 2010

Предположим, у меня есть массив или любая другая коллекция в этом отношении в классе и свойство, которое возвращает его следующим образом:

public class Foo
{
    public IList<Bar> Bars{get;set;}
}

Теперь я могу написать что-нибудь вроде этого:

public Bar Bar[int index]
{
    get
    {
        //usual null and length check on Bars omitted for calarity
        return Bars[index];
    }
}

Ответы [ 5 ]

11 голосов
/ 20 июля 2010

Нет - вы не можете писать именованные индексаторы в C #.Начиная с C # 4 вы можете использовать их для COM-объектов, но не можете их написать.

Как вы заметили, однако, foo.Bars[index] будет делать то, что вы хотите в любом случае ... этот ответ был в основномради будущих читателей.

Для уточнения: предоставление свойства Bars некоторого типа, имеющего индексатор, позволяет достичь того, чего вы хотите, но вы должны подумать, как это сделать:

  • Хотите ли вы, чтобы абоненты могли заменить коллекцию другой коллекцией?(Если нет, сделайте его доступным только для чтения.)
  • Хотите, чтобы вызывающие абоненты могли изменять коллекцию?Если так, то как?Просто заменить предметы или добавить / удалить их?Вам нужен контроль над этим?Ответы на эти вопросы будут определять, какой тип вы хотите представить - потенциально доступную только для чтения коллекцию или пользовательскую коллекцию с дополнительной проверкой.
1 голос
/ 30 мая 2016

Вы можете использовать явно реализованные интерфейсы, как показано здесь: Именованное индексированное свойство в C #? (см. Второй способ, показанный в этом ответе)

1 голос
/ 27 июля 2010

Однако вы можете свернуть свой собственный «именованный индексатор». Смотри

1 голос
/ 20 июля 2010

В зависимости от того, что вы действительно ищете, это может быть уже сделано для вас.Если вы пытаетесь использовать индексатор в коллекции Bars, это уже сделано для вас:* Тогда:

public Bar this[int index]
{
    get { return Bars[index]; }
}
0 голосов
/ 18 октября 2017
public class NamedIndexProp
{
    private MainClass _Owner;
    public NamedIndexProp(MainClass Owner) { _Owner = Owner;
    public DataType this[IndexType ndx]
    {
        get { return _Owner.Getter(ndx); }
        set { _Owner.Setter(ndx, value); }
    }
}
public MainClass
{
    private NamedIndexProp _PropName;
    public MainClass()
    {
       _PropName = new NamedIndexProp(this);
    }
    public NamedIndexProp PropName { get { return _PropName; } }
    internal DataType getter(IndexType ndx)
    {
        return ...
    }
    internal void Setter(IndexType ndx, DataType value)
    {
       ... = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...