0

我对 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。这是您实例化参数的地方吗?

谢谢你们。

4

2 回答 2

0

这与行动概念无关。
代表从一开始就存在于 .net 中,因此您应该从第一步开始。应先筑墙,后筑屋顶。
代表
Lambda 表达式
表达式树
但是你应该知道泛型类和方法,扩展方法......

于 2013-07-25T14:36:25.873 回答
0

看完这篇优秀的文章就明白了。

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

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

看起来魔法在这里发生

var builder = new ColumnBuilder(); 列生成器(生成器);

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

现在一切都清楚了。

谢谢你。

于 2013-07-25T15:16:52.753 回答