0

私は、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に渡しているようです。これは、パラメーターをインスタンス化する場所ですか?

皆さん、ありがとうございました。

4

2 に答える 2

0

アクションコンセプトとは関係ありません。
デリゲートは最初から .net に存在するため、最初のステップから開始する必要があります。屋根の前に壁を作る必要があります。
デリゲート
ラムダ式
式ツリー
ただし、一般的なクラスとメソッド、拡張メソッドについては知っておく必要があります...

于 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(); columnBuilder(ビルダー);

私は明らかに、デリゲートが関数への単なるポインターであるという事実を理解していませんでした(匿名かどうかに関係なく)。呼び出すときにパラメーターを指定する必要があります。(当たり前!)。

すべてが解決しました。

ありがとうございました。

于 2013-07-25T15:16:52.753 に答える