繁体   English   中英

将Object属性作为参数传递给Generic List Extension方法

[英]Pass Object properties as parameters into Generic List Extension method

我有一个具有Text和ID属性的GenericListItem对象。 我将各种DB对象转换为List,以便绑定到简单的通用列表控件。

我想在List上编写一个扩展方法,它允许我指定T的相关属性,它将被映射到GenericListItem的Text和ID属性,然后能够轻松地将任何List转换为列表

该方法的签名然后需要以某种方式接受T的两个属性,这样我就可以从列表中输出一个新的List

这是可能的吗?

我创建了一个转换项目的扩展方法,并使用它来转换列表:

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();
}

您可以使用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();
   }
}

无论您选择什么,都不要编写一个按名称指定属性的方法。 当您更改属性的名称时,编译器将无法向您显示您忘记更新对方法的调用中的名称,因为它们只是字符串。

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();

但是,您可以根据需要更改名称和类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM