6

クラス内にその問題に関する配列またはその他のコレクションがあり、次のようにそれを返すプロパティがあるとします。

public class Foo
{
    public IList<Bar> Bars{get;set;}
}

さて、私はこのようなものを書くことができます:

public Bar Bar[int index]
{
    get
    {
        //usual null and length check on Bars omitted for calarity
        return Bars[index];
    }
}
4

5 に答える 5

15

いいえ-C#で名前付きインデクサーを作成することはできません。C#4以降、COMオブジェクト用にそれらを使用することはできますが、書き込むことはできません。

お気づきのように、しかし、foo.Bars[index]とにかくあなたが望むことをするでしょう...この答えは主に将来の読者のためでした。

詳細に説明するBarsと、インデクサーを持つあるタイプのプロパティを公開すると、目的の結果が得られますが、公開する方法を検討する必要があります。

  • 発信者がコレクションを別のコレクションに置き換えることができるようにしますか?(そうでない場合は、読み取り専用プロパティにします。)
  • 発信者がコレクションを変更できるようにしますか?もしそうなら、どのように?アイテムを交換するだけですか、それとも追加/削除しますか?それを制御する必要がありますか?これらの質問への回答によって、公開するタイプが決まります。読み取り専用のコレクション、または追加の検証が行われるカスタムコレクションの可能性があります。
于 2010-07-20T19:22:07.820 に答える
1

ただし、独自の「名前付きインデクサー」をロールすることはできます。見る

于 2010-07-27T14:38:09.320 に答える
1

次に示すように、明示的に実装されたインターフェイスを使用できます 。C#の名前付きインデックス付きプロパティ?(その返信に示されている2番目の方法を参照してください)

于 2016-05-30T03:10:30.377 に答える
1
public class NamedIndexProp
{
    private MainClass _Owner;
    public NamedIndexProp(MainClass Owner) { _Owner = Owner;
    public DataType this[IndexType ndx]
    {
        get { return _Owner.Getter(ndx); }
        set { _Owner.Setter(ndx, value); }
    }
}
public MainClass
{
    private NamedIndexProp _PropName;
    public MainClass()
    {
       _PropName = new NamedIndexProp(this);
    }
    public NamedIndexProp PropName { get { return _PropName; } }
    internal DataType getter(IndexType ndx)
    {
        return ...
    }
    internal void Setter(IndexType ndx, DataType value)
    {
       ... = value;
    }
}
于 2017-10-18T00:15:20.547 に答える
0

あなたが本当に探しているものによっては、それはあなたのためにすでに行われているかもしれません。Barsコレクションでインデクサーを使用しようとしている場合は、すでに実行されています::

Foo myFoo = new Foo();
Bar myBar = myFoo.Bars[1];

または、次の機能を取得しようとしている場合:

Foo myFoo = new Foo();
Bar myBar = myFoo[1];

それで:

public Bar this[int index]
{
    get { return Bars[index]; }
}
于 2010-07-20T19:18:10.483 に答える