我正在深入研究MVC 4 WebGrid的代码,我看到它被用作这个
grid.Column("Id", format: (item) => item.GetSelectLink(item.Id)),
我不确定“item”参数是什么,所以我查看了源代码,看起来它是一个“WebGridRow”类。对我来说问题是,上面的代码正在寻找一个“.Id”属性,但它在类中不存在。唯一接近它的属性就像下面的
public object this[string name]
{
get
{
if (String.IsNullOrEmpty(name))
{
throw new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, "name");
}
object value = null;
if (!TryGetMember(name, out value))
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture,
HelpersResources.WebGrid_ColumnNotFound, name));
}
return value;
}
}
我从未见过定义为“this [string name]”的属性,这是什么意思?动态属性?
我试图在网上搜索,但不知道要搜索什么,我无法得出任何结果/解释。
请帮忙。感谢
答案 0 :(得分:6)
我认为这里有两个你不明白的同意(或者我根本不理解你的问题)。
this[..]
属性是索引属性。它们像数组表达式一样使用。例如,您可以想象创建自己的“数组”,如下所示:
public class MyArray {
string[] _storrage = new string[100];
public string this[int index] {
get { return _storrage[index]; }
set { _storrage[index] = value; }
}
}
您也可以使用多个参数创建索引属性,并且可以重载它们。例如,某些列表允许您按名称(this[string name]
)和索引(this[int index]
)访问项目。实际上它只是语法糖,所以你不必像在java中那样编写像getItem(int index)
这样的方法。
另一个似乎你不理解的概念(虽然从你的问题中不明显)是lambda方法。在您的代码中:
(item) => item.GetSelectLink(item.Id)
是一种lambda方法。例如,如果Colum
- 对象上的方法grid
具有以下签名:
public void Column<T>(string name, Func<T, string>)
表达式(item) => item.GetSelectLink(item.Id)
将评估为采用T
并返回字符串的方法。另一种创建相同功能的方法是:
// in class
public string GetIdField(YourClassType item) { return item.GetSelectLink(item.Id); }
// in Column-call
grid.Column("Id", format: GetIdField);
您可以在此处阅读有关lambdas的更多信息:http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx
<强> [编辑] 强>
为了展示一个lambda的快速示例,可能会对此有所了解:
var list = new List<string>() { "a", "b", "c" };
list.ForEach((item) => Console.WriteLine(item));
这将输出“a”,“b”和“c”(参见http://ideone.com/MGZxfr运行)。 等价物(不使用lambda)将是这样的:
void Main() {
var list = new List<string>() { "a", "b", "c" };
foreach(var item in list) Print(item);
}
void Print(string item) { Console.WriteLine(item); }
答案 1 :(得分:3)
它不是一个属性,而是一个[]运算符。
当您执行以下操作时,将调用get
方法:
var a = Ob["hello"]
和set
:
ob["hello"] = 5
答案 2 :(得分:2)
索引器,MSDN为您提供了
答案 3 :(得分:1)
这称为索引器 您也可以创建自己的索引器属性。
它通常用于集合,如数组,列表或字典。
http://msdn.microsoft.com/en-us/library/vstudio/6x16t2tx.aspx