W języku C# znajduję bardzo przydatne narzędzie indexed properties. Na przykład:Łatwe tworzenie właściwości, które obsługują indeksowanie w języku C#
var myObj = new MyClass();
myObj[42] = "hello";
Console.WriteLine(myObj[42]);
Jednak o ile wiem, nie ma cukier syntaktyczny wspierać obszary, które same obsługują indeksowanie (proszę mnie poprawić, jeśli się mylę). Na przykład:
var myObj = new MyClass();
myObj.field[42] = "hello";
Console.WriteLine(myObj.field[42]);
Powodem muszę to, że jestem już za pomocą właściwości indeksu w mojej klasie, ale mam GetNumX()
, GetX()
i SetX()
funkcje w następujący sposób:
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);
}
jak ty prawdopodobnie widzą, że eksponowanie ich jako jednej właściwości pola indeksowego miałoby więcej sensu. Mógłbym napisać niestandardową klasę, aby osiągnąć ten cel za każdym razem, gdy chcę uzyskać cukier syntaktyczny, ale cały kod tylko wydaje się niepotrzebny.
Tak więc napisałem niestandardową klasę, aby hermetyzować szablon i ułatwić tworzenie właściwości, które można indeksować. W ten sposób mogę dodać nową właściwość następująco:
public IndexedProperty<ReferenceTarget> TargetArray {
get {
return new IndexedProperty<int, ReferenceTarget>(
(int n) => GetTarget(n),
(int n, ReferenceTarget rt) => SetTarget(n, rt));
}
}
kod dla tej nowej klasy IndexedProperty wygląda następująco:
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);
}
}
}
Więc moje pytanie brzmi: czy istnieje lepszy sposób zrobić wszystko to?
Cóż konkretnie, czy istnieje bardziej idiomatyczny sposób w języku C# do tworzenia indeksowalnej właściwości pola, a jeśli nie, to jak mogę poprawić moją klasę IndexedProperty
?
EDYCJA: Po dalszych badaniach Jon Skeet nazywa to "named indexer".
Sprawdź http://stackoverflow.com/questions/23081402/named-indexed-property-in-c/23081403#23081403 – Spook