Creación sencilla de propiedades que admiten la indexación en C #

En C # encuentropropiedades indexadas extremadamente útil. Por ejemplo:

var myObj = new MyClass();
myObj[42] = "hello"; 
Console.WriteLine(myObj[42]);

Sin embargo, hasta donde sé, no hay azúcar sintáctica para admitir campos que admitan la indexación (corríjame si me equivoco). Por ejemplo:

var myObj = new MyClass();
myObj.field[42] = "hello"; 
Console.WriteLine(myObj.field[42]);

La razón por la que necesito esto es porque ya estoy usando la propiedad index en mi clase, pero tengoGetNumX(), GetX()ySetX() funciona de la siguiente manera:

public int NumTargetSlots {  
    get { return _Maker.NumRefs; }  
}
public ReferenceTarget GetTarget(int n) {
    return ReferenceTarget.Create(_Maker.GetReference(n));
}
public void SetTarget(int n, ReferenceTarget rt) {
    _Maker.ReplaceReference(n, rt._Target, true);
}

Como probablemente pueda ver, exponerlos como una propiedad de campo indexable tendría más sentido. Podría escribir una clase personalizada para lograr esto cada vez que quiera el azúcar sintáctico, pero todo el código repetitivo parece innecesario.

Así que escribí una clase personalizada para encapsular la placa repetitiva y facilitar la creación de propiedades que se puedan indexar. De esta manera puedo agregar una nueva propiedad de la siguiente manera:

public IndexedProperty<ReferenceTarget> TargetArray  {
    get { 
       return new IndexedProperty<int, ReferenceTarget>(
           (int n) => GetTarget(n), 
           (int n, ReferenceTarget rt) => SetTarget(n, rt));
       }
}

El código para esta nueva clase IndexedProperty se ve así:

public class IndexedProperty<IndexT, ValueT>
{
    Action<IndexT, ValueT> setAction;
    Func<IndexT, ValueT> getFunc;

    public IndexedProperty(Func<IndexT, ValueT> getFunc, Action<IndexT, ValueT> setAction)
    {
        this.getFunc = getFunc;
        this.setAction = setAction;
    }

    public ValueT this[IndexT i]
    {
        get {
            return getFunc(i);
        }
        set {
            setAction(i, value);
        }
    }
}

Entonces mi pregunta es:¿Hay una mejor manera de hacer todo esto??

Bueno, para ser específicos, ¿hay una forma más idiomática en C # para crear una propiedad de campo indexable, y si no, cómo podría mejorar miIndexedProperty ¿clase?

EDITAR: Después de más investigaciones, Jon Skeet llama a esto un "indexador nombrado".

Respuestas a la pregunta(7)

Su respuesta a la pregunta