6

そのようなC#から使用できるクラスをVB.NETで作成できますか:

myObject.Objects[index].Prop = 1234;

確かに、配列を返すプロパティを作成できました。ただし、インデックスが 0 ベースではなく 1 ベースであることが要件であるため、このメソッドは何らかの方法でインデックスをマップする必要があります。

私はそのようにしようとしていましたが、C# はこれを直接呼び出すことはできないと言っていました:

   Public ReadOnly Property Objects(ByVal index As Integer) As ObjectData
        Get
            If (index = 0) Then
                Throw New ArgumentOutOfRangeException()
            End If
            Return parrObjectData(index)
        End Get
    End Property

EDIT 少し不明確だった場合は申し訳ありません:

C#は、このメソッドを次のように呼び出すことしかできません

myObject.get_Objects(index).Prop = 1234

だがしかし

myObject.Objects[index].Prop = 1234;

これが私が達成したいことです。

4

4 に答える 4

16

構文は次のとおりです。

Default Public ReadOnly Property Item(ByVal index as Integer) As ObjectData
  Get
    If (index = 0) Then
      Throw New ArgumentOutOfRangeException()
    End If
    Return parrObjectData(index)
  End Get
End Property

キーワードは、Defaultインデクサーを作成する魔法です。残念ながら、C# は名前付きインデクサーをサポートしていません。カスタム コレクション ラッパーを作成し、代わりにそれを返す必要があります。

Public ReadOnly Property Objects As ICollection(Of ObjectData)
  Get
    Return New CollectionWrapper(parrObjectData)
  End Get
End Property

は次のCollectionWrapperようになります。

Private Class CollectionWrapper
  Implements ICollection(Of ObjectData)

  Private m_Collection As ICollection(Of ObjectData)

  Public Sub New(ByVal collection As ICollection(Of ObjectData))
    m_Collection = collection
  End Sub

  Default Public ReadOnly Property Item(ByVal index as Integer) As ObjectData
    Get
      If (index = 0) Then
        Throw New ArgumentOutOfRangeException()
      End If
      Return m_Collection(index)
    End Get
  End Property

End Class
于 2011-05-13T12:53:54.630 に答える
5

デフォルトのインデクサーを持つ構造体を使用して、C# で名前付きインデクサーを偽装できます。

public class ObjectData
{
}

public class MyClass
{
    private List<ObjectData> _objects=new List<ObjectData>();
    public ObjectsIndexer Objects{get{return new ObjectsIndexer(this);}}

    public struct ObjectsIndexer
    {
        private MyClass _instance;

        internal ObjectsIndexer(MyClass instance)
        {
            _instance=instance;
        }

        public ObjectData this[int index]
        {
            get
            {
                return _instance._objects[index-1];
            }
        }
    }
}

void Main()
{
        MyClass cls=new MyClass();
        ObjectData data=cls.Objects[1];
}

それが良い考えかどうかは別の問題です。

于 2011-05-13T13:46:02.830 に答える
1

C# は、名前付きのインデックス付きプロパティの宣言をサポートしていません(ただし、インデクサーを作成することはできます) が、setter または getter を明示的に ( get_MyProperty/ set_MyProperty)呼び出すことで、他の言語 (VB など) で宣言されたインデックス付きプロパティにアクセスできます。

于 2011-05-13T12:55:08.387 に答える
0

0ベースのインデックスを使用して、1ベースであるという錯覚をコーダーに与えてはどうでしょうか。

すなわち

Return parrObjectData(index-1)
于 2011-05-13T12:47:45.210 に答える