如何最好地手写映射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}
}
如果您真的想手动执行此操作,那么方便的方法是扩展方法:
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(或其他映射工具),它将使用反射来按名称匹配属性。
你可以这样做:
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();
第二种方法的一个额外好处是,有时您可能不需要进行任何映射,只需使用 aList<IMyInterface>
就可以满足任何一种类型。