我对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。这是你实例化参数的地方吗?
谢谢大家。
答案 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(助洗剂);
我显然不明白委托的事实,只是指向函数的指针(匿名与否)。调用它时仍需要提供参数。 (废话!)。
现在全部清理完毕。
谢谢。