如何用C#映射库实现嵌套Message到MessageViewModel的对象转换?
推荐用AutoMapper轻松完成嵌套对象映射
当然有!这类业务模型到UI视图模型的嵌套映射场景,AutoMapper是最常用也最省心的工具——它专门解决这种对象间的属性转换,尤其是对嵌套结构的支持非常友好,完全不用你手动写递归循环去处理子消息列表。
步骤1:安装AutoMapper
首先通过NuGet安装AutoMapper包:
# NuGet包管理器控制台 Install-Package AutoMapper # 或者用.NET CLI dotnet add package AutoMapper
步骤2:配置映射规则
创建一个映射配置类,指定Message到MessageViewModel的转换规则,AutoMapper会自动递归处理嵌套的List<Message>到List<MessageViewModel>的转换。对于源类没有的IsSelected属性,我们可以给它设置默认值:
public class MessageMappingProfile : Profile { public MessageMappingProfile() { CreateMap<Message, MessageViewModel>() // 给IsSelected设置默认选中状态为false .ForMember(dest => dest.IsSelected, opt => opt.MapFrom(src => false)); // 无需额外配置嵌套的Messages属性,AutoMapper会自动应用上面的映射规则递归转换 } }
步骤3:初始化并使用映射器
根据你的项目类型初始化Mapper:
- 如果是依赖注入场景(比如ASP.NET Core),可以在
Program.cs里注册AutoMapper服务:
builder.Services.AddAutoMapper(typeof(MessageMappingProfile));
然后在需要映射的类中注入IMapper并使用:
public class MessageService { private readonly IMapper _mapper; public MessageService(IMapper mapper) { _mapper = mapper; } public MessageViewModel MapToViewModel(Message businessMessage) { return _mapper.Map<MessageViewModel>(businessMessage); } }
- 如果是非DI场景(比如控制台程序),可以手动初始化:
var config = new MapperConfiguration(cfg => { cfg.AddProfile<MessageMappingProfile>(); }); IMapper mapper = config.CreateMapper(); // 假设你有一个业务层的Message实例 var businessMessage = new Message { Subject = "项目进展同步", CreationDate = DateTime.Now, Messages = new List<Message> { new Message { Subject = "前端模块开发完成", CreationDate = DateTime.Now.AddHours(-2) }, new Message { Subject = "数据库脚本已提交", CreationDate = DateTime.Now.AddHours(-3) } } }; // 一键完成嵌套映射 var viewModel = mapper.Map<MessageViewModel>(businessMessage);
其他可选工具
除了AutoMapper,Mapster也是一个轻量高效的选择,它的性能更优,用法也类似,同样支持自动嵌套映射,你可以根据自己的喜好选择。
内容的提问来源于stack exchange,提问作者Radu Olteanu
相关产品推荐
相关产品推荐

