Возможно ли именованное свойство индексатора?
Предположим, у меня есть массив или любая другая коллекция в этом отношении в классе и свойство, которое возвращает его следующим образом:
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 ответов
В зависимости от того, что вы действительно ищете, это может быть сделано для вас. Если вы пытаетесь использовать индексатор в коллекции Bars, это уже сделано для вас:
Foo myFoo = new Foo();
Bar myBar = myFood.Bars[1];
Или, если вы пытаетесь получить следующую функциональность:
Foo myFoo = new Foo();
Bar myBar = myFoo[1];
Затем:
public Bar this[int index]
{
get { return Bars[index]; }
}
Нет - вы не можете писать именованные индексаторы в C#. Начиная с C# 4 вы можете использовать их для COM-объектов, но не можете их написать.
Однако, как вы заметили, foo.Bars[index]
будет делать то, что вы хотите в любом случае... этот ответ был в основном для будущих читателей.
Для уточнения: разоблачение Bars
Свойство некоторого типа, имеющее индексатор, достигает того, чего вы хотите, но вы должны подумать, как его выставить:
- Вы хотите, чтобы вызывающие абоненты могли заменить коллекцию другой коллекцией? (Если нет, сделайте его доступным только для чтения.)
- Вы хотите, чтобы вызывающие абоненты могли изменять коллекцию? Если так, то как? Просто заменить предметы или добавить / удалить их? Вам нужен контроль над этим? Ответы на эти вопросы будут определять, какой тип вы хотите представить - потенциально доступную только для чтения коллекцию или пользовательскую коллекцию с дополнительной проверкой.
Вы можете использовать явно реализованные интерфейсы, как показано здесь: Именованное индексированное свойство в C#? (см. второй способ, показанный в этом ответе)
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;
}
}
Вы можете свернуть свой собственный "именованный индексатор". Увидеть