2013-07-25 118 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