3

我正在研究 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]”这样定义的属性,这是什么意思?动态属性?

我试图在网上搜索,但不知道要搜索什么,我找不到任何结果/解释。

请帮忙。谢谢

4

4 回答 4

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]) 访问项目。实际上,它只是语法糖,因此您不必像getItem(int index)在 java 中那样编写方法。

似乎您不理解的另一个概念(尽管从您的问题中看不出来)是 lambda 方法。在您的代码中:

(item) => item.GetSelectLink(item.Id)

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

public void Column<T>(string name, Func<T, string>)

该表达式(item) => item.GetSelectLink(item.Id)将评估为采用 aT并返回字符串的方法。创建相同功能的另一种方法是这样做:

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

// in Column-call
grid.Column("Id", format: GetIdField);

您可以在此处阅读有关 lambda 的更多信息: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); }
于 2013-07-26T06:36:35.450 回答
3

它不完全是一个属性,而是一个 [] 运算符。当您执行以下操作时,将调用
该方法:get

var a = Ob["hello"]

set

ob["hello"] = 5
于 2013-07-26T06:35:08.517 回答
3

它是一个索引器MSDN涵盖了你

于 2013-07-26T06:37:00.747 回答
1

这称为索引器 您也可以创建自己的索引器属性。

它通常用于数组、列表或字典等集合中。

http://msdn.microsoft.com/en-us/library/vstudio/6x16t2tx.aspx

于 2013-07-26T06:36:55.790 回答