1

Text プロパティと ID プロパティを持つ GenericListItem オブジェクトがあります。単純な汎用リスト コントロールにバインドする目的で、さまざまな DB オブジェクトを List にキャストしています。

GenericListItem の Text および ID プロパティにマップされる T の関連プロパティを指定し、任意の List をリストに簡単に変換できる拡張メソッドを List に記述したいと考えています。

メソッドのシグネチャは、何らかの方法で T の 2 つのプロパティを受け入れる必要があるため、リストから新しいリストを出力できます。

このようなことは可能ですか?

4

3 に答える 3

2

アイテムを変換する拡張メソッドを作成し、それを使用してリストを変換します。

public static GenericListItem ToListItem<T>(this T obj, Func<T, string> textFunc, Func<T, int> idFunc)
{
    return new GenericListItem
    {
        Text = textFunc(obj),
        Id = idFunc(obj)
    };
}

public static List<GenericListItem> ToItemList<T>(this IEnumerable<T> seq, Func<T, string> textFunc, Func<T, int> idFunc)
{
    return seq.Select(i => i.ToListItem(textFunc, idFunc)).ToList();
}
于 2012-09-28T11:44:35.140 に答える
1

車輪の再発明の代わりに、Linqを使用できます。

List<string> list = new List<string>();
list.Add("first");
list.Add("second");

List<ListItem> items = list.Select(s => new ListItem() {Id = s.Length, Text = s.ToLower()}).ToList();
// or if ListItem has a constructor with parameters
List<ListItem> items = list.Select(s => new ListItem(s.Length, s.ToLower()).ToList();

あなたが本当に拡張を主張するなら、あなたは上記のロジックを拡張メソッドにラップすることができます、しかし私は要点を理解していません:

List<ListItem> items = list.ToItemList(s => s.Length, s => s.ToLower());

static class Helper
{
   public static List<ListItem> ToItemList<T>(this IList<T> list, Func<T, int> idFunc, Func<T,string> textFunc)
   {
      return list.Select(s => new ListItem() { Id = idFunc(s), Text = textFunc(s) }).ToList();
   }
}

どちらを選択する場合でも、プロパティを名前で指定するメソッドを記述しないでください。プロパティの名前を変更すると、メソッドの呼び出しで名前を更新するのを忘れたことをコンパイラが表示できなくなります。これは、プロパティが単なる文字列であるためです。

于 2012-09-28T11:52:44.287 に答える
0
public class customList<T> : IList<T>
    {
        public List<GenericListItem> ToCustomListItem()
        {
             List<GenericListItem> listItems = new List<GenericListItem>();
             //logic to convert list to GenericListItem
        }
    }

使用するには、次のことを行います

customList<object> list = new customList<object>();
//populate your list
list.ToCustomListItem();

ただし、必要に応じて名前とタイプを変更できます。

于 2012-09-28T11:54:16.877 に答える