如何使用自动映射器映射两个列表

本文关键字:映射 两个 列表 何使用 | 更新日期: 2023-09-27 18:35:33

我在不同的位置有两个类。

namespace IVR.MyEndpointApi.POCO
{
    [Table("MyServiceUrl")]
    public class MyURL
    {
        [Key]
        [Column("FacilityID")]
        public int FacilityId { get; set; }
        [Column("Url")]
        public string Url { get; set; }
    }
}
namespace OpsTools.Models
{
    public class MyServiceEndpoint
    {
        public int FacilityId { get; set; }
        public string Url { get; set; }
    }
}

在另一种方法中,我获取列表并想要转换,然后将其作为所需的类型返回。我手动执行以下操作:

public List<MyServiceEndpoint> GetAllUrls()
{
    var management = GetMyEndpointManagement();
    var list = management.GetAllUrls(); 
    var urlList = new List<MyServiceEndpoint>();
    foreach (var item in list)
    {
        // the type of item is MyURL
        var MyUrl = new MyServiceEndpoint();
        myUrl.FacilityId = item.FacilityId;
        myUrl.Url = item.Url;
        urlList.Add(myUrl);
    }
    return urlList;
}

我的问题:我可以应用自动映射器吗?

编辑:

我使用了代码:

        var myUrls = management.GetAllUrls();
        var urlList = new List<MyServiceEndpoint>();
        Mapper.CreateMap<MyServiceEndpoint, MyURL>();
        urlList = Mapper.Map<List<MyServiceEndpoint>, List<MyURL>>(myUrls);
        Mapper.AssertConfigurationIsValid();

但是,它有错误:

Error   CS1503  Argument 1: cannot convert from 'System.Collections.Generic.List' to ....

如何使用自动映射器映射两个列表

哎呀,来吧。我更改顺序,然后它起作用。

 urlList = Mapper.Map<List<MyServiceEndpoint>, List<MyURL>>(myUrls);

 urlList = Mapper.Map<List< List<MyURL>,MyServiceEndpoint>>(myUrls);

如果您检查实际的异常(您忽略了相关部分),您将看到Mapper.Map<TSource, TDestination>()尝试从错误的类型映射到错误的类型。

完整的错误将显示:

无法从System.Collections.Generic.List<MyURL>转换为System.Collections.Generic.List<MyServiceEndpoint>

这意味着该调用实际上将尝试List<MyServiceEndpoint> 映射,需要该类型的参数,而您的源列表不是。

只需在Map()调用中切换类型:

urlList = Mapper.Map<List<MyURL>, List<MyServiceEndpoint>>(myUrls);

或者完全删除新列表创建,移动声明并使用类型推断:

var urlList = Mapper.Map<List<MyServiceEndpoint>>(myUrls);