2

如何最好地手写映射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}
}
4

2 回答 2

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(或其他映射工具),它将使用反射来按名称匹配属性。

于 2013-07-15T07:14:45.480 回答
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();

第二种方法的一个额外好处是,有时您可能不需要进行任何映射,只需使用 aList<IMyInterface>就可以满足任何一种类型。

于 2013-07-15T07:14:59.330 回答