我有一个具有 Text 和 ID 属性的 GenericListItem 对象。为了绑定到简单的通用列表控件,我将各种 DB 对象转换为 List。
我想在 List 上编写一个扩展方法,允许我指定 T 的相关属性,这些属性将映射到 GenericListItem 的 Text 和 ID 属性,然后能够轻松地将任何 List 转换为列表
然后,该方法的签名需要以某种方式接受 T 的两个属性,这样我就可以从列表中输出一个新的 List
这样的事情可能吗?
我有一个具有 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();
但是,是的,您可以根据需要更改名称和类型。