C# 将对象属性作为参数传递给泛型列表扩展方法

C# 将对象属性作为参数传递给泛型列表扩展方法,c#,generics,extension-methods,C#,Generics,Extension Methods,我有一个GenericListItem对象,它具有文本和ID属性。为了绑定到简单的通用列表控件,我将各种DB对象强制转换到列表中 我想在List上编写一个扩展方法,它允许我指定T的相关属性,这些属性将映射到GenericListItem的Text和ID属性,然后能够轻松地将任何列表转换为列表 方法的签名需要以某种方式接受T的两个属性,这样我就可以从列表中输出一个新列表 这样做可能吗?我将创建一个扩展方法来转换项,并使用它来转换列表: public static GenericListItem T

我有一个GenericListItem对象,它具有文本和ID属性。为了绑定到简单的通用列表控件,我将各种DB对象强制转换到列表中

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

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


这样做可能吗?

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

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();
}
public static GenericListItem ToListItem(此T对象,Func textFunc,Func idFunc)
{
返回新的GenericListItem
{
Text=textFunc(obj),
Id=idFunc(obj)
};
}
公共静态列表ToItemList(此IEnumerable seq、Func textFunc、Func idFunc)
{
返回seq.Select(i=>i.tolistem(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 List=新列表();
列表。添加(“第一”);
列表。添加(“第二”);
List items=List.Select(s=>newlistItem(){Id=s.Length,Text=s.ToLower()}).ToList();
//或者如果ListItem具有带参数的构造函数
List items=List.Select(s=>newlistItem(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();
   }
}
List items=List.ToItemList(s=>s.Length,s=>s.ToLower());
静态类助手
{
公共静态列表ToItemList(此IList列表、Func idFunc、Func textFunc)
{
返回列表。选择(s=>newlistItem(){Id=idFunc(s),Text=textFunc(s)});
}
}
无论您选择什么,都不要编写按名称指定属性的方法。当您更改属性的名称时,编译器将无法向您显示您忘记更新方法调用中的名称,因为它们只是字符串。

公共类customList:IList
public class customList<T> : IList<T>
    {
        public List<GenericListItem> ToCustomListItem()
        {
             List<GenericListItem> listItems = new List<GenericListItem>();
             //logic to convert list to GenericListItem
        }
    }
{ 公共列表到自定义列表项() { List listItems=新列表(); //将列表转换为GenericListItem的逻辑 } }
要使用,请执行以下操作

customList<object> list = new customList<object>();
//populate your list
list.ToCustomListItem();
customList=new customList();
//填充您的列表
ToCustomListItem();

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

您应该能够创建一个从列表继承的类,然后创建一个自定义toListItems()扩展方法。所有这些方法都有效,但标记为正确,这为我提供了更好的解决方案