私は、C# の "アクション" の概念とデリゲート全般に少し慣れていません。
MVC でカスタム html コンポーネントを構築する方法を研究しようとしていますが、MVContrib のグリッド コンポーネントを開始することにしました。
列を追加するには、通常、
<%= 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 パラメーターです。この例では、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)
"
関数、
最初の2行は
var builder = new ColumnBuilder<T>();
columnBuilder(builder);
彼らは何をしますか?それはColumBuilderオブジェクトをインスタンス化し、それをパラメーターとしてActionメソッドのcolumBuilderに渡しているようです。これは、パラメーターをインスタンス化する場所ですか?
皆さん、ありがとうございました。