C#怎么使用AutoMapper C#对象属性映射配置方法

来源:这里教程网 时间:2026-02-21 17:35:53 作者:

AutoMapper 是 C# 中最常用的对象映射库,用于简化不同类(尤其是 DTO 与实体)之间的属性赋值。核心思路是:先定义映射规则,再用

IMapper
实例执行映射。配置方式主要有两种——静态初始化(旧版兼容)和依赖注入方式(推荐,.NET Core / .NET 5+ 标准做法)。

使用依赖注入注册 AutoMapper(推荐)

Program.cs
(.NET 6+)或
Startup.cs
中配置:

安装 NuGet 包:
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
调用
AddAutoMapper()
自动扫描含
Profile
的程序集,或显式指定 Profile 类型
示例(.NET 6+ Program.cs):

builder.Services.AddAutoMapper(typeof(UserProfile)); // 扫描 UserProfile 类所在程序集

定义映射配置 Profile 类

继承

Profile
,在构造函数中用
CreateMap<tsource tdestination>()</tsource>
声明规则:

支持链式配置:如
.ForMember()
自定义字段映射、
.Ignore()
忽略属性、
.MapFrom()
指定源表达式
支持条件映射:
.Condition()
.PreCondition()
支持扁平化映射(如
User.Address.Street → UserDto.Street
),默认开启;也可禁用或手动配置
示例 Profile:

public class UserProfile : Profile<br>{<br>  public UserProfile()<br>  {<br>    CreateMap<User, UserDto>()<br>      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.FirstName + " " + src.LastName))<br>      .ForMember(dest => dest.Age, opt => opt.MapFrom(src => DateTime.Now.Year - src.BirthDate.Year))<br>      .ForMember(dest => dest.Email, opt => opt.Ignore());<br>  }<br>}

在服务中注入并使用 IMapper

Controller 或 Service 构造函数中注入

IMapper
,调用
Map<tdestination>(source)</tdestination>
Map(source, destination)

Map<userdto>(user)</userdto>
:创建新对象并映射(最常用)
Map(user, userDto)
:将源数据填充到已有目标实例(适合编辑场景)
支持集合映射:
Map<list>>(users)</list>
users.ProjectTo<userdto>(mapper.ConfigurationProvider)</userdto>
(配合 EF 查询时延迟映射,避免全量加载)
Controller 示例:

private readonly IMapper _mapper;<br>public UsersController(IMapper mapper) => _mapper = mapper;<br><br>public IActionResult Get(int id)<br>{<br>  var user = _context.Users.Find(id);<br>  var dto = _mapper.Map<UserDto>(user); // 自动按 Profile 规则转换<br>  return Ok(dto);<br>}

常见注意事项和技巧

避免踩坑,提升可维护性:

映射前务必调用
AssertConfigurationIsValid()
(开发环境)验证配置是否合法,比如类型不匹配、未映射的非空属性等
不要在 Profile 中写业务逻辑,保持纯配置;复杂转换可封装为自定义 ValueResolver 或 IValueConverter 若 DTO 和实体命名一致、类型兼容,AutoMapper 默认自动映射(约定优于配置),无需显式声明 对于只读属性(如 get-only auto-property),需启用
AllowNullCollections = true
或配置
ForCtorParam
支持构造函数注入

基本上就这些。配置清晰、按需定制、结合 DI 使用,AutoMapper 就能既安全又高效地帮你处理对象转换。

相关推荐