如何将List<T1>
手写到List<T2>
的最佳方式?
我的示例课程:
public class T1
{
public int ID {get; set}
public string Name {get; set}
}
public class T2
{
public int ID {get; set}
public string Name {get; set}
}
答案 0 :(得分:6)
如果您真的想手动执行此操作,那么便捷的方法是扩展方法:
public static T2 ToT2(this T1 t1)
{
return new T2 { ID = t1.ID, Name = t1.Name };
}
public static List<T2> ToT2List(this IEnumerable<T1> t1List)
{
return t1List.Select(t1 => t1.ToT2()).ToList();
}
用法:
T2 t2 = t1.ToT2();
List<T2> t2List = t1List.ToT2List();
但我建议您使用Automapper(或其他映射工具),它将使用反射按名称匹配属性。
答案 1 :(得分:2)
你可以这样做:
public static class Mapper
{
public static T1 ToT1(T2 t)
{
return new T1 { ID = t.ID, Name = t.Name };
}
public static T2 ToT2(T1 t)
{
return new T2 { ID = t.ID, Name = t.Name };
}
}
List<T1> listOfT1 = listOfT2.Select(Mapper.ToT1).ToList();
List<T2> listOfT2 = listOfT1.Select(Mapper.ToT2).ToList();
或者,如果您有权更改代码,我建议您添加一个界面:
public IMyInterface
{
int ID { get; set; }
string Name { get; set; }
}
public static class Mapper
{
public static TResult Map<TInput, TResult>(TInput t)
where TInput : IMyInterface
where TResult : IMyInterface, new
{
return new TResult { ID = t.ID, Name = t.Name };
}
}
List<T1> listOfT1 = listOfT2.Select(Mapper.Map<T1, T2>).ToList();
List<T2> listOfT2 = listOfT1.Select(Mapper.Map<T2, T1>).ToList();
您可以通过利用推断的类型参数来改善这一点,因此您只需指定结果类型:
public static class Mapper<TResult>
where TResult : IMyInterface, new
{
public static TResult Map<TInput, TResult>(TInput t)
where TInput : IMyInterface
{
return new TResult { ID = t.ID, Name = t.Name };
}
}
List<T1> listOfT1 = listOfT2.Select(Mapper<T1>.Map).ToList();
List<T2> listOfT2 = listOfT1.Select(Mapper<T2>.Map).ToList();
第二种方法的另一个好处是,有时您可能不需要进行任何映射,只需使用List<IMyInterface>
就可以满足任何一种类型。