c# - 使用 Automapper 基于内置数据类型创建对象

标签 c# automapper

我有两个名为 ApprenticeshipDtoApprenticeship 的类,如下所示

public class ApprenticeshipDto
{
    public int Id { get; set; }
    public string PersonFirstName { get; set; }
    public string PersonLastName { get; set; }
}

 public class Apprenticeship
 {
     public virtual int Id { get; set; }
     public Person Person { get; set; }      
 }

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

这就是我尝试将 ApprenticeshipDto 映射到 Apprenticeship 的方式:

Mapper.CreateMap<ApprenticeshipDto, Apprenticeship>();

Apprenticeship a = Mapper.Map<Apprenticeship>(Apprdto);

问题是所有属性都已正确映射,但 Person 未正确映射。 是否可以告诉 Automapper 创建 Person 属性并自动将 PersonFirstNamePersonLastName 分配给 FirstNameLastName人对象?

最佳答案

是的,可以通过使用 custom value resolver 告诉 AutoMapper 将 DTO 属性映射到目标对象属性。类(class)。解析器将 PersonFirstNamePersonLastName 属性映射到新的 Person 对象:

// create the resolver class 
// -> extract person info from DTO and return a new Person object
public class CustomResolver : ValueResolver<ApprenticeshipDto, Person>
{
    protected override Person ResolveCore(ApprenticeshipDto source)
    {
        return new Person
            {
                    FirstName = source.PersonFirstName,
                    LastName = source.PersonLastName
            };
    }
}

然后在映射之前在 AutoMapper 配置中使用新的自定义解析器类:

Mapper.CreateMap<ApprenticeshipDto, Apprenticeship>();

var adto = new ApprenticeshipDto
{
    Id = 10,
    PersonFirstName = "John",
    PersonLastName = "Doe"
};
// configure custom mapping
Mapper.CreateMap<ApprenticeshipDto, Apprenticeship>()
    .ForMember(destination => destination.Person, opt => opt.ResolveUsing<CustomResolver>());
Apprenticeship a = Mapper.Map<Apprenticeship>(adto);
Console.WriteLine("{0} - {1} - {2}", a.Id, a.Person.FirstName, a.Person.LastName);

输出符合预期:

10 - John - Doe

关于c# - 使用 Automapper 基于内置数据类型创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29588336/

相关文章:

c# - Automapper:想要通过接口(interface)映射重用代码

c# - .Net 的 Rx : how to combine Scan with Throttle

c# - Rabbitmq消息到达时间戳

c# - AutoMapper:如果指定类型的源对象为空,则将目标对象的所有属性设置为默认值

c# - 在类中映射相同对象类型的属性会调用 Equals 和 GetHashCode

c# - 未找到自动映射引用 C#

c# - 无法使用syncvars统一设置文本

c# - 如何在 Visual Studio 测试中模拟数据存储库?

c# - UpdatePanel 和 RegisterStartupScript 之间有冲突吗?

c# - 在单元测试中模拟 Automapper 是一种好习惯吗?