2

C# でインデックス付きプロパティが必要です。

public Boolean IsSelected[Guid personGuid]
{
   get {
      Person person = GetPersonByGuid(personGuid);
      return person.IsSelected;
   }
   set {
      Person person = GetPersonByGuid(personGuid);
      person.IsSelected = value;
   }
}
public Boolean IsApproved[Guid personGuid]
{
   get {
      Person person = GetPersonByGuid(personGuid);
      return person.IsApproved;
   }
   set {
      Person person = GetPersonByGuid(personGuid);
      person.IsApproved= value;
   }
}

Visual Studio は、非整数のインデクサー構文に不満を持っています。

私は.NETが非整数インデクサーをサポートしていることを知っています。


別の言語では、次のように書きます。

private
   function GetIsSelected(ApproverGUID: TGUID): Boolean;
   procedure SetIsSelected(ApproverGUID: TGUID; Value: Boolean);
   function GetIsApproved(ApproverGUID: TGUID): Boolean;
   procedure SetIsApproved(ApproverGUID: TGUID; Value: Boolean);
public
   property IsSelected[ApproverGuid: TGUID]:Boolean read GetIsSelected write SetIsSelected;
   property IsApproved[ApproverGuid: TGUID]:Boolean read GetIsApproved write SetIsApproved;
end;
4

5 に答える 5

7

構文が正しくありません:

public Boolean this[Guid personGuid]
{
   get {
      Person person = GetPersonByGuid(personGuid);
      return person.IsSelected;
   }
   set {
      Person person = GetPersonByGuid(personGuid);
      person.IsSelected = value;
   }
}

インデクサーはthisキーワードを使用して宣言されます。独自の名前は使用できません。

インデクサーの使用 (C# プログラミング ガイド)から:

クラスまたは構造体でインデクサーを宣言するには、 this キーワードを使用します


さらに、型を受け入れるインデクサーを 1 つしか持つことができません。これは、C# のインデクサー構文の制限です (IL の制限かもしれませんが、確かではありません)。

于 2012-10-10T17:57:55.017 に答える
5

インデクサーは、thisキーワードでのみ機能します。ここを参照してください。

this キーワードは、インデクサーを定義するために使用されます。

于 2012-10-10T17:57:13.433 に答える
1

Matt BurlandとOdedが言ったように、インデクサーはこのキーワードでのみ機能するため、必要なインターフェイスを備えたプロキシクラスが必要です。

public class PersonSelector
{
    private MyClass owner;

    public PersonSelector(MyClass owner)
    {
        this.owner = owner;
    }

    public bool this[Guid personGuid]
    {
       get {
          Person person = owner.GetPersonByGuid(personGuid);
          return person.IsSelected;
       }
       set {
          Person person = owner.GetPersonByGuid(personGuid);
          person.IsSelected = value;
       }
    }

}

public class MyClass
{
    public MyClass()
    {
        this.IsSelected = new PersonSelector(this);
    }   

    public PersonSelector IsSelected { get; private set; }

    ...
}
于 2012-10-10T18:03:45.950 に答える
0

@ジョジャンはここで答えました:

C# 3.0 仕様

「インデクサーのオーバーロードにより、クラス、構造体、またはインターフェイスで複数のインデクサーを宣言できます。ただし、それらのシグネチャがそのクラス、構造体、またはインターフェイス内で一意である場合に限ります。」

または、データセットが小さい場合は IList できます

public IList<Boolean> IsSelected
{
   get { ... }
}

public IList<Boolean> IsApproved
{
   get { .... }
}

またはインターフェイスを使用して複数のインデクサー手法を使用します

于 2012-10-10T18:25:50.730 に答える