C# では、インデックス付きプロパティが非常に便利だと思います。例えば:
var myObj = new MyClass();
myObj[42] = "hello";
Console.WriteLine(myObj[42]);
ただし、私が知る限り、インデックス作成をサポートするフィールドをサポートする構文糖衣はありません (間違っている場合は修正してください)。例えば:
var myObj = new MyClass();
myObj.field[42] = "hello";
Console.WriteLine(myObj.field[42]);
これが必要な理由は、クラスで既に index プロパティを使用しているためですが 、次のようGetNumX()
に、、、GetX()
およびSetX()
関数があります。
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);
}
おそらくお分かりのように、これらを 1 つのインデックス可能なフィールド プロパティとして公開する方が理にかなっています。シンタックス シュガーが必要なときはいつでも、これを実現するカスタム クラスを作成できますが、定型コードはすべて不必要に思えます。
そこで、ボイラープレートをカプセル化し、インデックス付けできるプロパティを簡単に作成できるようにするカスタム クラスを作成しました。このようにして、次のように新しいプロパティを追加できます。
public IndexedProperty<ReferenceTarget> TargetArray {
get {
return new IndexedProperty<int, ReferenceTarget>(
(int n) => GetTarget(n),
(int n, ReferenceTarget rt) => SetTarget(n, rt));
}
}
この新しい IndexedProperty クラスのコードは次のようになります。
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);
}
}
}
だから私の質問は:これをすべて行うためのより良い方法はありますか?
具体的に言うと、C# でインデックス可能なフィールド プロパティを作成するためのより慣用的な方法はありますか? そうでない場合、どうすればIndexedProperty
クラスを改善できますか?
編集:さらに調査した結果、Jon Skeet はこれを「名前付きインデクサー」と呼んでいます。