假设我在类中有一个数组或任何其他集合,以及一个返回它的属性,如下所示:
public class Foo
{
public IList<Bar> Bars{get;set;}
}
现在,我可以写这样的东西:
public Bar Bar[int index]
{
get
{
//usual null and length check on Bars omitted for calarity
return Bars[index];
}
}
答案 0 :(得分:11)
不 - 你不能在C#中编写命名索引器。从C#4开始,您可以将它们用于COM对象,但是您无法编写它们。
然而,正如你所注意到的那样,foo.Bars[index]
无论如何都会做你想要的......这个答案主要是为了未来的读者。
详细说明:公开具有索引器的某种类型的Bars
属性可以达到您想要的效果,但您应该考虑如何公开它:
答案 1 :(得分:1)
根据您真正想要的内容,可能已经为您完成了。如果您正尝试在Bars集合上使用索引器,那么它已经为您完成了::
Foo myFoo = new Foo();
Bar myBar = myFood.Bars[1];
或者,如果您尝试获得以下功能:
Foo myFoo = new Foo();
Bar myBar = myFoo[1];
然后:
public Bar this[int index]
{
get { return Bars[index]; }
}
答案 2 :(得分:1)
但是,您可以滚动自己的“命名索引器”。见
答案 3 :(得分:1)
您可以使用显式实现的接口,如下所示: Named indexed property in C#?(参见该回复中显示的第二种方式)
答案 4 :(得分:0)
public class NamedIndexProp
{
private MainClass _Owner;
public NamedIndexProp(MainClass Owner) { _Owner = Owner;
public DataType this[IndexType ndx]
{
get { return _Owner.Getter(ndx); }
set { _Owner.Setter(ndx, value); }
}
}
public MainClass
{
private NamedIndexProp _PropName;
public MainClass()
{
_PropName = new NamedIndexProp(this);
}
public NamedIndexProp PropName { get { return _PropName; } }
internal DataType getter(IndexType ndx)
{
return ...
}
internal void Setter(IndexType ndx, DataType value)
{
... = value;
}
}