5

我不完全确定我的所有术语是否正确,如果我错了,请原谅我。我想知道是否可以向该方法发送参数。以以下为例。

public item (int index)  
{  
    get { return list[index]; }  
    set { list[index] = value; }  
}

我知道它是这样的,它会出错。我要问的是是否有某种方法可以让它工作。有什么建议还是我应该想办法解决它?

提前致谢。

4

7 回答 7

21

尝试这个:

// This returns an instance of type "Foo",
// since I didn't know the type of "list".
// Obviously the return type would need to
// match the type of whatever "list" contains.
public Foo this[int index]
{
    get { return list[index]; }
    set { list[index] = value; }
}

这是 C# 的索引器语法,它有一些限制(它不如 VB.NET 的参数属性灵活),但它确实适用于您的特定示例。

于 2009-09-24T13:11:50.000 回答
6

正如其他人所展示的那样,您可以将它变成一个索引器 - 顺便说一下,它可以有多个参数。

不能做的是在 C# 中命名一个索引器......虽然你可以在 VB 中。所以你不能有两个索引器,一个被调用Foo,另一个被调用Bar......你需要编写返回值的属性,这些值本身就是可索引的。老实说,这有点痛苦:(

于 2009-09-24T13:14:12.477 回答
5

这称为索引器属性

public int this [int index]  
{      
     get { return list[index]; }      
     set { list[index] = value; }  
}
于 2009-09-24T13:13:37.797 回答
3

我认为您可能正在寻找的是:

public Something this[int index]
{
    get
    {
         return list[index];
    }
    set
    {
         list[index] = value;
    }
}
于 2009-09-24T13:13:43.537 回答
1

作为记录,虽然其他答案是有效的,但您可能还需要考虑使用以下方法:

public IList<Something> items { get; set; }

然后可以按如下方式使用:

Something item = myFoo.items[1];

其他答案将以以下略有不同的方式使用:

Something item = myFoo[1];

您想要的取决于您要实现的具体目标,如果不查看其余代码,则很难确定。

于 2009-09-24T13:20:13.890 回答
1

除了现在已经多次提到的索引器之外,另一种可能性是使用索引器制作自定义类并将其实例作为属性返回。

例子:

public class IntList
{
    public IntList(IEnumerable<int> source)
    {
        items = source.ToArray();
        Squares = new SquareList(this);
    }

    private int[] items;

    // The indexer everyone else mentioned
    public int this[int index]
    {
        get { return items[index]; }
        set { items[index] = value; }
    }

    // Other properties might be useful:
    public SquareList Squares { get; private set; }

    public class SquareList
    {
        public SquareList(IntList list)
        {
            this.list = list;
        }

        private IntList list;

        public int this[int index]
        {
            get { return list.items[index] * list.items[index]; }
        }
    }
}
于 2009-09-24T13:24:19.550 回答
0

您可以使用 indexator 来解决这个问题

public object this[string name]
        {
            get
            {
                int idx = FindParam(name);
                if (idx != -1)
                    return _params[idx].Value;

                throw new IndexOutOfRangeException(String.Format("Parameter \"{0}\" not found in this collection", name));
            }
            set 
            { 
                int idx = FindParam(name);
                if (idx != -1)
                    _params[idx].Value = value;
                else
                    throw new IndexOutOfRangeException(String.Format("Parameter \"{0}\" not found in this collection", name));
            }
        }
于 2009-09-24T13:14:46.937 回答