Как насчет этого: написать класс, который выполняет одно и только одно: обеспечивает произвольный доступ к элементам некоторой базовой индексированной коллекции. Дайте этому классу this
индексатор.
Для свойств, к которым вы хотите предоставить произвольный доступ, просто верните экземпляр этого класса индексатора.
Тривиальная реализация:
public class Indexer<T>
{
private IList<T> _source;
public Indexer(IList<T> source)
{
_source = source;
}
public T this[int index]
{
get { return _source[index]; }
set { _source[index] = value; }
}
}
public static class IndexHelper
{
public static Indexer<T> GetIndexer<T>(this IList<T> indexedCollection)
{
// could cache this result for a performance improvement,
// if appropriate
return new Indexer<T>(indexedCollection);
}
}
Рефакторинг в ваш код:
private string[] myProperty;
public Indexer<string> MyProperty
{
get
{
return myProperty.GetIndexer();
}
}
Это позволит вам иметь столько индексированных свойств, сколько вам нужно, без необходимости открывать эти свойства с помощью интерфейса IList<T>
.