Einfache Erstellung von Eigenschaften, die die Indizierung in C # @ unterstütz

In C # finde ichindexierte Eigenschaften extrem nützlich. Beispielsweise

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

Meines Wissens gibt es jedoch keinen syntaktischen Zucker zur Unterstützung von Feldern, die selbst die Indizierung unterstützen (bitte korrigieren Sie mich, wenn ich falsch liege). Beispielsweise

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

Der Grund, warum ich das brauche, ist, dass ich bereits die index -Eigenschaft für meine Klasse verwende, aber ich habeGetNumX(), GetX(), undSetX() funktioniert wie folgt:

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);
}

Wie Sie wahrscheinlich sehen können, ist es sinnvoller, diese als eine indizierbare Feldeigenschaft verfügbar zu machen. Ich könnte jedes Mal, wenn ich den syntaktischen Zucker haben möchte, eine benutzerdefinierte Klasse schreiben, um dies zu erreichen, aber der gesamte Code auf dem Boilerplate scheint nur unnötig zu sein.

So habe ich eine benutzerdefinierte Klasse geschrieben, um das Boilerplate zu kapseln und das Erstellen indizierbarer Eigenschaften zu vereinfachen. Auf diese Weise kann ich eine neue Eigenschaft wie folgt hinzufügen:

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

Der Code für diese neue IndexedProperty-Klasse sieht folgendermaßen aus:

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);
        }
    }
}

Also meine Frage ist:ibt es eine bessere Möglichkeit, all dies zu tu?

Nun, um genau zu sein, gibt es in C # eine idiomatischere Möglichkeit, eine indizierbare Feldeigenschaft zu erstellen, und wenn nicht, wie könnte ich mein @ verbesserIndexedProperty Klasse?

BEARBEITEN Nach weiteren Recherchen nennt Jon Skeet dies ein "named indexer ".

Antworten auf die Frage(14)

Ihre Antwort auf die Frage