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,所以我不确定这是否可行),要么你所做的没有意义