C#中用于索引属性的正确语法是什么

时间:2013-02-19 23:33:58

标签: c# indexer

如何声明索引属性?

public class PublishProperties : ScriptableObject {

List<string> m_shellPathsT = new List<string>();
List<string> m_shellPathsL = new List<string>();
public List<string> ShellPath[int index]
{
    get 
    {
        if (index == 0)
            return m_shellPathsT;
        else
            return m_shellPathsL;
    }
}

这不编译,我不知道如何编码。由于其他要求,我必须有两个不同的列表,这些列表是这样声明的。

我通常会有一系列清单...

或者像这样

public List<string>[] m_shellPaths = { new List<string>(), new List<string>() };
然而,这又不能与其他因素一起工作......(基本上有一些自动发生的序列化不适用于在构造函数中声明的变量或类似上面的变量。)

3 个答案:

答案 0 :(得分:1)

Please read the docs before asking questions.

public List<string> this[int index]
{
    get 
    {
        if (index == 0)
            return m_shellPathsT;
        else
            return m_shellPathsL;
    }
}

答案 1 :(得分:0)

C#不支持索引属性。您可以使用

为类本身编制索引
public List<string> this[int index]
{
    get 
    {
        if (index == 0)
            return m_shellPathsT;
        else
            return m_shellPathsL;
    }
}

但在这个非常具体的情况下,我无法做到这一点,因为需要几套这种类型的实现,序列化使我无法使用更优雅的声明。

可以使用方法但不具有与属性相同的功能 我发现了更多information

然而,在这种情况下,没有理由不能添加额外的数组

public List<string> m_shellPathsT = new List<string>();
public List<string> m_shellPathsL = new List<string>() ;
public List<string>[] m_shellPaths = new List<string>[2];

public PublishProperties()
{
    m_shellPaths[0] = m_shellPathsT;
    m_shellPaths[1] = m_shellPathsL;
}

答案 2 :(得分:0)

根据您的评论,您似乎希望通过m_shellPathsT访问m_shellPathsSShellPaths的项目。

因此,假设foo是PublishProperties类型的对象,您希望能够编写如下代码:

foo.ShellPaths[0];

这里发生的事实上是两件事:

  1. 您正在访问ShellPaths类型的媒体资源PublishProperties。它返回List<string>
  2. 您正在访问返回列表的索引0处的项目。它返回string
  3. 属性ShellPaths具有以下结构:

    public List<string> ShellPaths
    {
        get { return <something>; }
    }
    

    如您所见,没有索引。

    但是因为你想根据索引访问不同的列表,ShellPaths的实现不能简单地返回你内部存储的一个列表。

    如果索引为m_shellPathsT,则必须创建一个返回0的第一项的新列表。否则返回m_shellPathsS的相应项。

    为实现这一目标,您可以像这样实施ShellPaths

    public List<string> ShellPaths
    {
        get { return m_shellPathsT.Take(1).Concat(m_shellPathsS.Skip(1)).ToList(); }
    }
    

    现在,这样可行,但效率很低:每次有人访问ShellPaths时,都会创建一个新列表。如果您要创建一次特殊列表,可能在构造函数中或任何内部列表的内容发生更改时,会更好。