En C# encuentro indexed properties extremadamente útil. Por ejemplo:Fácil creación de propiedades que admiten indexación en C#
var myObj = new MyClass();
myObj[42] = "hello";
Console.WriteLine(myObj[42]);
Sin embargo por lo que yo sé no hay azúcar sintáctica para apoyar a sí mismos campos que soporte de indexación (por favor, corríjanme si me equivoco). Por ejemplo:
var myObj = new MyClass();
myObj.field[42] = "hello";
Console.WriteLine(myObj.field[42]);
La razón que necesito esto es que ya estoy usando la propiedad índice en mi clase, pero tengo GetNumX()
, GetX()
y SetX()
funciones 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 la exposición de estos 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 simplemente parece innecesario.
Así que escribí una clase personalizada para encapsular el texto estándar y para facilitar la creación de propiedades que puedan indexarse. De esta manera puedo añadir 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 parece:
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);
}
}
}
Así que mi pregunta es: hay una mejor manera de hacer todas esto?
Bueno, para ser específico, ¿existe una forma más idiomática en C# para crear una propiedad de campo indexable y, de no ser así, cómo podría mejorar mi clase IndexedProperty
?
EDIT: Después de más investigaciones, Jon Skeet llama a esto un "named indexer".
Compruebe http://stackoverflow.com/questions/23081402/named-indexed-property-in-c/23081403#23081403 – Spook