方括号在属性中意味着什么?

Lim*_*ing 3 c# asp.net-mvc-4

我正在深入研究MVC 4 WebGrid的代码,我看到它被用作这个

    grid.Column("Id", format: (item) => item.GetSelectLink(item.Id)),
Run Code Online (Sandbox Code Playgroud)

我不确定"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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我从未见过像"this [string name]"这样定义的属性,这是什么意思?动态属性?

我试图在网上搜索,但不知道要搜索什么,我无法得出任何结果/解释.

请帮忙.谢谢

Alx*_*ndr 6

我认为这里有两个你不明白的同意(或者我根本不理解你的问题).

this[..]属性是索引属性.它们像数组表达式一样使用.例如,您可以想象创建自己的"数组",如下所示:

public class MyArray {
     string[] _storrage = new string[100];
     public string this[int index] {
         get { return _storrage[index]; }
         set { _storrage[index] = value; }
     }
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用多个参数创建索引属性,并且可以重载它们.例如,某些列表允许您通过name(this[string name])和index(this[int index])访问项目.实际上它只是语法糖,所以你不必像getItem(int index)在java中那样编写方法.

另一个似乎你不理解的概念(虽然你的问题不明显)是lambda方法.在你的代码中:

(item) => item.GetSelectLink(item.Id)
Run Code Online (Sandbox Code Playgroud)

是一种lambda方法.例如,如果-object Colum上的方法grid具有以下签名:

public void Column<T>(string name, Func<T, string>)
Run Code Online (Sandbox Code Playgroud)

表达式(item) => item.GetSelectLink(item.Id)将计算为采用a T并返回字符串的方法.另一种创建相同功能的方法是:

// in class
public string GetIdField(YourClassType item) { return item.GetSelectLink(item.Id); }

// in Column-call
grid.Column("Id", format: GetIdField);
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于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));
Run Code Online (Sandbox Code Playgroud)

这将输出"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); }
Run Code Online (Sandbox Code Playgroud)