2011-05-13 73 views
5

我可以在VB.NET中創建一個類可以從C#中使用這樣的被用來創建索引:在VB.NET可以從C#

myObject.Objects[index].Prop = 1234; 

當然我可以創建返回數組的屬性。但要求是索引是基於1而不是基於0的,所以這種方法必須以某種方式映射索引:

我想讓它變成這樣,但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 

編輯 很抱歉,如果我是一個有點不清楚:

C#只允許我來調用這個方法就像

myObject.get_Objects(index).Prop = 1234

但不

myObject.Objects[index].Prop = 1234;

這是我想達到的目標。

+0

'Default'是您缺少的關鍵字。布賴恩的答案已經讓你覆蓋。 – 2011-05-13 12:58:22

+0

您正在尋找索引屬性,這是C#中不直接提供的一項功能。 – Gabe 2011-05-13 12:58:55

回答

4

您可以在C#中使用具有默認值i的結構僞造命名索引器ndexer:

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

如果這是一個好主意是一個不同的問題。

0

爲什麼不使用基於0的索引,而是讓編碼器錯覺它是基於1的?

Return parrObjectData(index-1) 
+0

方法簽名應該如何? – codymanix 2011-05-13 12:50:17

+0

就像它一樣,這應該是唯一應該改變的行。除了刪除(索引= 0)如果語句塊 – w69rdy 2011-05-13 12:51:55

+0

但我的問題是,與當前的方法簽名,VB.NET不允許我調用像myObject.Objects [索引] – codymanix 2011-05-13 12:53:04

12

的語法是:

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 
+0

的方法如果我想要的屬性有一個名稱,然後項目? – codymanix 2011-05-13 13:05:03

+0

您忘記了「財產」關鍵字。 – Styxxy 2017-07-12 09:19:48

1

C#不支持命名爲索引屬性(儘管你可以創建索引)的聲明,但可以訪問索引屬性聲明以其他語言(如VB)通過明確調用setter或getter(get_MyProperty/set_MyProperty