List <t> </t>的手写映射器

时间:2013-07-15 07:11:21

标签: c# mapping

如何将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}
}

2 个答案:

答案 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>就可以满足任何一种类型。