C# 与单个对象相比,映射列表时自动映射行为有所不同

C# 与单个对象相比,映射列表时自动映射行为有所不同,c#,mapping,automapper,C#,Mapping,Automapper,我有两个目标: public class Person1 { public string FirstName { get; set; } public string LastName { get; set; } } public class Person2 { public string FIRST_NAME { get; set; } public string LAST_NAME { get; set; } public int? Foo { get

我有两个目标:

public class Person1
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Person2
{
    public string FIRST_NAME { get; set; }
    public string LAST_NAME { get; set; }
    public int? Foo { get; set; }
}
两者之间的区别在于,目标对象具有名为Foo的附加属性。我希望Automapper在Person1到Person2的列表之间映射时使用Foo的目标值

当我映射单个对象时,我可以实现这种行为。但是,当我将Person1的集合映射到Person2时,Foo的值被设置为null,而不是等于1。请参阅下面我的单元测试

    [TestMethod]
    public void TestUseDestValWhenNotFoundIgnore()
    {
        Mapper.CreateMap<Person1, Person2>()
            .ForMember(dest => dest.FIRST_NAME, opt => opt.MapFrom(src => src.FirstName))
            .ForMember(dest => dest.LAST_NAME, opt => opt.MapFrom(src => src.LastName))
            .ForMember(dest => dest.Foo, opt =>
            {
                opt.UseDestinationValue();
            });

        var personList1 = new List<Person1>();
        var personList2 = new List<Person2>();

        for (int i = 0; i < 50; i++)
        {
            personList1.Add(new Person1
            {
                FirstName = "FirtName",
                LastName = "LastName"
            });

            personList2.Add(new Person2
            {
                FIRST_NAME = "",
                LAST_NAME = "",
                Foo = 1
            });
        }


        var sourcePerson = new Person1
        {
            FirstName = "FirstName",
            LastName = "LastName"
        };

        var destinationPerson = new Person2
        {
            FIRST_NAME = "",
            LAST_NAME = "",
            Foo = 1
        };

        // This works as expected, the assert is successful, Foo = 1
        Mapper.Map(sourcePerson, destinationPerson);
        Assert.IsTrue(destinationPerson.Foo == 1);

        // This assert fails, Foo is null for every property
        Mapper.Map(personList1, personList2);
        Assert.IsTrue(personList2.All(p => p.Foo == 1));
    }
[TestMethod]
public void TestUseDestValWhenNotFoundIgnore()
{
Mapper.CreateMap()
.ForMember(dest=>dest.FIRST\u NAME,opt=>opt.MapFrom(src=>src.FirstName))
.ForMember(dest=>dest.LAST_NAME,opt=>opt.MapFrom(src=>src.LastName))
.ForMember(dest=>dest.Foo,opt=>
{
opt.UseDestinationValue();
});
var personList1=新列表();
var personList2=新列表();
对于(int i=0;i<50;i++)
{
人员列表1.添加(新人员1
{
FirstName=“FirtName”,
LastName=“LastName”
});
人员列表2.添加(新人员2
{
名字=”,
姓氏=”,
Foo=1
});
}
var sourcePerson=newperson1
{
FirstName=“FirstName”,
LastName=“LastName”
};
var destinationPerson=新人员2
{
名字=”,
姓氏=”,
Foo=1
};
//这与预期的一样,断言成功,Foo=1
Mapper.Map(sourcePerson,destinationPerson);
Assert.IsTrue(destinationPerson.Foo==1);
//此断言失败,每个属性的Foo都为null
Mapper.Map(personList1,personList2);
Assert.IsTrue(personList2.All(p=>p.Foo==1));
}

我猜它不知道如何将源对象与目标对象匹配起来。要么你需要告诉AutoMapper如何匹配列表中的对象(我没有真正使用AutoMapper,所以我不确定这是否可行),要么你所做的没有意义我猜是它不知道如何匹配源对象和目标对象。要么你需要告诉AutoMapper如何匹配列表中的对象(我没有真正使用过AutoMapper,所以我不确定这是否可行),要么你所做的没有意义