关于c#:是否可以命名索引器属性?

Is named indexer property possible?

假设我在类中有一个数组或任何其他与此相关的集合,并且有一个返回它的属性,如下所示:

1
2
3
4
public class Foo
{
    public IList<Bar> Bars{get;set;}
}

现在,我可以写这样的东西吗?

1
2
3
4
5
6
7
8
public Bar Bar[int index]
{
    get
    {
        //usual null and length check on Bars omitted for calarity
        return Bars[index];
    }
}


不-不能用C语言编写命名索引器。从C 4开始,您可以将它们用于COM对象,但不能编写它们。

然而,正如你所注意到的,无论怎样,foo.Bars[index]都会做你想做的…这个答案主要是为了将来的读者。

详细说明:公开具有索引器的某个类型的Bars属性可以达到您想要的效果,但是您应该考虑如何公开它:

  • 是否希望呼叫者能够用其他集合替换集合?(如果不是,则将其设置为只读属性。)
  • 是否希望呼叫者能够修改集合?如果是,如何?只是更换项目,还是添加/删除项目?你需要控制吗?这些问题的答案将决定要公开的类型-可能是只读集合,也可能是带有额外验证的自定义集合。


您可以使用显式实现的接口,如下所示:C中的命名索引属性(见回复中的第二种方式)


但是,您可以滚动自己的"命名索引器"。见

  • 为什么C不实现索引属性?
  • 在C中轻松创建支持索引的属性#

取决于你真正想要的是什么,它可能已经为你做了。如果您试图在bars集合上使用索引器,则已经为您完成了:

1
2
Foo myFoo = new Foo();
Bar myBar = myFood.Bars[1];

或者如果您试图获得以下功能:

1
2
Foo myFoo = new Foo();
Bar myBar = myFoo[1];

然后:

1
2
3
4
public Bar this[int index]
{
    get { return Bars[index]; }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;
    }
}