Search code examples
c#.netvb.netindexerlanguage-interoperability

Create Indexer in VB.NET which can be used from C#


Can I create a class in VB.NET which can be used from C# like that:

myObject.Objects[index].Prop = 1234;

Sure I could create a property which returns an array. But the requirement is that the index is 1-based, not 0-based, so this method has to map the indices somehow:

I was trying to make it like that, but C# told me I cannot call this directly:

   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 Sorry if I was a bit unclear:

C# only allows my to call this method like

myObject.get_Objects(index).Prop = 1234

but not

myObject.Objects[index].Prop = 1234;

this is what I want to achieve.


Solution

  • You can fake named indexers in C# using a struct with a default indexer:

    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];
    }
    

    If that's a good idea is a different question.