需要帮助来理解MVCContrib Grid中的这段代码

时间:2013-07-25 14:27:12

标签: c# asp.net-mvc-4 delegates action

我对C#中的“Action”概念和一般委托有点新鲜。

我正在尝试研究如何在MVC中构建自定义html组件,我选择了MVCContrib的网格组件来开始。

要添加列,通常我们会

 <%= Html.Grid(Model).Columns(column =>
            {
                column.For(model => model.Date).Format("{0:d}");
                column.For(model => model.DayAmount);
                column.For(model => model.LeaveType);
            })
            %> 

我看到了Columns的来源,如下所示

public IGridWithOptions<T> Columns(Action<ColumnBuilder<T>> columnBuilder)
        {
            var builder = new ColumnBuilder<T>();
            columnBuilder(builder);

            foreach (var column in builder)
            {
                if (column.Position == null) 
                {
                    _gridModel.Columns.Add(column);
                } 
                else
                {
                    _gridModel.Columns.Insert(column.Position.Value, column);   
                }
            }

            return this;
        }

我感到困惑的是Action参数在这个例子中,Type是CustomBuilder,那么什么时候“CustomBuilder”对象被实例化了?

我想,我可以将上面的调用语句重写为

Html.Grid(Model).Columns(delegate(CustomBuilder<T> column)
{
});

或更明确的

Html.Grid(Model).Columns(new Action<CustomBuilder<T>>(delegate(CustomBuilder<T> column)
                      {
                      });
);

所以我们说,当Action用上面的“new”关键字实例化时,param“CustomBuilder”也被实例化了?

最后,在

public IGridWithOptions<T> Columns(Action<ColumnBuilder<T>> columnBuilder)

功能,

前两行是

var builder = new ColumnBuilder<T>();
columnBuilder(builder);

他们做了什么?看起来它正在实例化ColumBuilder对象并将其作为参数传递给Action方法columBuilder。这是你实例化参数的地方吗?

谢谢大家。

2 个答案:

答案 0 :(得分:0)

这与行动概念无关 代表从一开始就出现在.net中,所以你应该从第一步开始。应该在屋顶之前建造墙壁 Delegates
Lambda Expressions
Expression trees
但是你应该知道泛型类和方法,扩展方法......

答案 1 :(得分:0)

阅读这篇优秀文章后得到它。

http://www.codeproject.com/Articles/47887/C-Delegates-Anonymous-Methods-and-Lambda-Expressio

当它谈论Func时,这个概念适用于Action,它不会返回任何结果。

看起来神奇的事情发生在这里

var builder = new ColumnBuilder(); columnBuilder(助洗剂);

我显然不明白委托的事实,只是指向函数的指针(匿名与否)。调用它时仍需要提供参数。 (废话!)。

现在全部清理完毕。

谢谢。