4

メソッドの引数に基づいて選択リストを作成する再利用可能なメソッドを作成するにはどうすればよいのでしょうか? 以下のようなことを考えていました。

public IEnumerable<SelectListItem> CreateSelectList(IList<T> entities, T value, T text)
{

   return  entities
           .Select(x => new SelectListItem
                           {
                               Value = x.value.ToString(),
                               Text = x.text.ToString()
                           });
}

少し後ろ向きだと思いますが。このようなメソッドを呼び出す方法がわかりません。最初の引数に Category の IList を指定して呼び出すと、コンパイラは Type Category を Type T に割り当てることができないと不平を言いますか? また、メソッドの引数をラムダに挿入するにはどうすればよいですか? どんな助けでも大歓迎です!

私がそれを呼び出すために使用しようとしているコード(これは間違っていますが、あなたはアイデアを得るでしょう)

viewModel.Categories = _formServices.CreateSelectList(categories, Id, Name);

より一般的で再利用可能なコードを作成しようとしています:

viewModel.Categories = categories
                      .Select(x => new SelectListItem
                     {
                         Value = x.Id.ToString(),
                         Text = x.Name
                      });

回答のために編集

クレジットは、実用的な回答に対して@Pavel Backshyに送られます。誰にも役立つ場合に備えて、彼の回答に作成した拡張機能を編集したかったのです。拡張機能は、ミックスに .Where 句を追加するだけです。

    public IEnumerable<SelectListItem> CreateSelectListWhere<T>(IList<T> entities, Func<T, bool> whereClause, Func<T, object> funcToGetValue, Func<T, object> funcToGetText)
    {
        return entities
               .Where(whereClause)
               .Select(x => new SelectListItem
                {
                    Value = funcToGetValue(x).ToString(),
                    Text = funcToGetText(x).ToString()
                });
    }
4

2 に答える 2

8

Reflection を使用して名前でプロパティ値を取得することもできますが、Func を使用する方がエレガントで柔軟だと思います。メソッドを次のように変更します。

public IEnumerable<SelectListItem> CreateSelectList<T>(IList<T> entities, Func<T, object> funcToGetValue, Func<T, object> funcToGetText)
{
    return entities
            .Select(x => new SelectListItem
            {
                Value = funcToGetValue(x).ToString(),
                Text = funcToGetText(x).ToString()
            });
}

そして、次の方法で使用できます。

viewModel.Categories = _formServices.CreateSelectList(categories, x => x.Id, x => x.Name);
于 2012-08-19T13:03:14.053 に答える