C# – 索引属性?

我已经使用Visual Basic很长一段时间了,并且最近决定开始学习C#作为学习更复杂语言的一步。

作为这个跳转的一部分,我决定将一些旧的VB项目手动转换为C#。 我遇到的问题是使用带参数/索引的属性转换具有类的库。

VB中的属性是这样的:

Friend Property Aproperty(ByVal Index As Integer) As AClass Get Return Alist.Item(Index) End Get Set(ByVal value As KeyClass) Alist.Item(Index) = value End Set End Property 

当我使用该属性时,它将像这样使用:

 Bclass.Aproperty(5) = new AClass 

这是我想在C#中实现的这种事情,但无法弄清楚我的生活只是如何做到这一点,因为看起来C#不能做到这一点。

由于C#不支持参数化属性(这是您要显示的),因此您需要将此代码转换为两个函数,即GetAProperty(索引)和SetAProperty(索引)。

我们将一个50,000+ LOC应用程序从VB转换为C#,由于依赖于参数化属性,它需要进行大量修改。 但是,它是可行的,它只需要一种不同的方式来思考这样的属性。

索引器允许类或结构的实例像数组一样被索引。 索引器类似于属性,除了它们的访问器接受参数。

http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

使用this关键字定义索引器,如下所示:

 public T this[int i] { get { // This indexer is very simple, and just returns or sets // the corresponding element from the internal array. return arr[i]; } set { arr[i] = value; } } 

.NET类库设计指南建议每个类只有一个索引器。

您可以根据索引参数类型重载索引器

 public int this[int i] public string this[string s] 

但不是基于返回值

 // NOT valid public int this[int i] public string this[int i] 

我认为你不能指定只能通过索引访问的属性,但你可以只返回一个可索引的值(如数组或List )并在结果上使用[]

 public List Aproperty { get { return this.theList; } } Aclass foo = this.Apropety[0]; 

当然,任何带索引器的东西都可以代替List

或者,你可以Aproperty做:定义一个索引器(在类本身上),它返回一个具有属性Aproperty的对象,如下所示: Aclass foo = this[0].Aproperty