被命名的索引器属性可能吗?

时间:2010-07-20 19:16:23

标签: c# properties indexed-properties

假设我在类中有一个数组或任何其他集合,以及一个返回它的属性,如下所示:

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

5 个答案:

答案 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;
    }
}