我对 C# 中的“动作”和一般委托的概念有点陌生。
我正在尝试研究如何在MVC中构建一个自定义的html组件,我选择了MVCContrib的grid组件入手。
要添加列,通常我们会这样做
<%= 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)
{
});
);
那么我们是说,当使用上面的“new”关键字实例化 Action 时,参数“CustomBuilder”也被实例化了吗?
最后,在
" public IGridWithOptions<T> Columns(Action<ColumnBuilder<T>> columnBuilder)
"
功能,
前两行是
var builder = new ColumnBuilder<T>();
columnBuilder(builder);
他们在做什么?看起来它正在实例化 ColumBuilder 对象并将其作为参数传递给 Action 方法 columBuilder。这是您实例化参数的地方吗?
谢谢你们。