2013-07-25 83 views
0

我对C#中的“Action”概念和一般的委托有点新鲜。需要帮助来理解MVCContrib中的这段代码Grid

我想研究如何在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); 
      }) 
      %> 

,我看到列的源像下面

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参数在这种情况下,类型是CustomBuilder,那么“CustomBuilder”对象何时实例化?

我想,我可以重写上面

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

或略偏明确为

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

那么,我们说,当行动与“新”的实例调用语句上面的关键字,参数“CustomBuilder”也被实例化了?

最后,在

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

功能,

的前两行是

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

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

谢谢大家。

回答

0

明白了阅读这篇优秀的文章之后。

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

,而它的谈论FUNC按键,概念适用于行动,不返回任何结果。

看起来像魔术在这里发生

VAR建设者=新ColumnBuilder(); columnBuilder(builder);

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

现在全部清理完毕。

谢谢。

0

这与动作概念无关。
委托人从一开始就以.net出现,因此您应该从第一步开始。应该在屋顶之前建造墙壁。
Delegates
Lambda Expressions
Expression trees
但是你应该知道有关通用类和方法,扩展方法...

+0

@谢谢彼得。我阅读所有文章,仍然很难将上面这些具体例子中的点连接起来,这是我学习的方式。不管怎么说,还是要谢谢你。 – Liming