我不完全确定我的所有术语是否正确,如果我错了,请原谅我。我想知道是否可以向该方法发送参数。以以下为例。
public item (int index)
{
get { return list[index]; }
set { list[index] = value; }
}
我知道它是这样的,它会出错。我要问的是是否有某种方法可以让它工作。有什么建议还是我应该想办法解决它?
提前致谢。
尝试这个:
// 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 的参数属性灵活),但它确实适用于您的特定示例。
正如其他人所展示的那样,您可以将它变成一个索引器 - 顺便说一下,它可以有多个参数。
你不能做的是在 C# 中命名一个索引器......虽然你可以在 VB 中。所以你不能有两个索引器,一个被调用Foo
,另一个被调用Bar
......你需要编写返回值的属性,这些值本身就是可索引的。老实说,这有点痛苦:(
这称为索引器属性
public int this [int index]
{
get { return list[index]; }
set { list[index] = value; }
}
我认为您可能正在寻找的是:
public Something this[int index]
{
get
{
return list[index];
}
set
{
list[index] = value;
}
}
作为记录,虽然其他答案是有效的,但您可能还需要考虑使用以下方法:
public IList<Something> items { get; set; }
然后可以按如下方式使用:
Something item = myFoo.items[1];
其他答案将以以下略有不同的方式使用:
Something item = myFoo[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]; }
}
}
}
您可以使用 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));
}
}