Mapster 是一个开源的.NET 对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射。

<>  <>以下是 Mapster 的一些主要特点和使用方法: <>  <>**安装**:可以通过 NuGet 包管理器控制台使用以下命令安装 Mapster:`Install-Package Mapster` 或者使用.NET Core CLI 命令:`dotnet add package Mapster` <>  <>**基本用法**: <>1. 映射到新对象:Mapster 创建目标对象并将值映射到该对象。 <>```csharp <>var destObject = sourceObject.adapt<Destination>(); <>``` <>2. 映射到现有对象:先创建对象,然后 Mapster 会将源对象映射到该对象。 <>```csharp <>sourceObject.adapt(destObject); <>``` <>  <>**可查询扩展**:Mapster 提供了映射可查询对象(IQueryable)的扩展。例如,使用 Entity Framework 时,可以减少手动编写 select 操作。 <>```csharp <>using (myDbContext context = new myDbContext()) <>{ <>// 使用 Mapster 提供的 ProjectToType 扩展方法 <>var destinations = context.Sources.ProjectToType<Destination>().ToList(); <>// 相对于手工操作 <>var destinations = context.Sources.Select(c => new Destination <>{ <>Id = c.Id, <>Name = c.Name, <>Surname = c.Surname, <>.... <>}).ToList(); <>} <>``` <>  <>**配置(TypeAdapterConfig)**: <>可以直接使用 Mapster 内置的全局静态配置 `TypeAdapterConfig.GlobalSettings`,也可以实例化一个配置 `new TypeAdapterConfig()`。默认情况下,Mapster 会根据两个实体字段名称相同进行匹配。如果需要更复杂的映射规则,可以进行如下配置: <>1. 直接在配置对象中设置映射关系: <>```csharp <>var config = new TypeAdapterConfig(); <>config.ForType<User, UserDto>() <>.Map(dest => dest.UserAge, src => src.Age) <>.Map(dest => dest.UserSex, src => src.Sex); <>var mapper = new Mapper(config); <>``` <>2. 使用接口的方式(需要实现 `IRegister`): <>```csharp <>public class UserDtoRegister : IRegister <>{ <>public void Register(TypeAdapterConfig config) <>{ <>config.ForType<User, UserDto>() <>.Map(dest => dest.UserAge, src => src.Age); <>//... <>} <>} <>// 实例化 Mapper <>var config = new TypeAdapterConfig(); <>// 只有要给定 IRegister 所在的程序集名称,Mapster 会自动识别 IRegister,进行配置注入。 <>config.Scan("程序集名称 1","程序集名称 2"); <>var mapper = new Mapper(config); <>``` <>  <>**忽略字段**:可以通过以下方式忽略某些字段的映射。 <>```csharp <>var config = new TypeAdapterConfig(); <>config.ForType<User, UserDto>() <>.Map(dest => dest.UserAge, src => src.Age) <>.Map(dest => dest.UserSex, src => src.Sex) <>.IgnoreNullValues(true) // 忽略空值映射 <>.Ignore(dest => dest.UserAge) // 忽略指定字段 <>.IgnoreAttribute(typeof(DataMemberAttribute)) // 忽略指定特性的字段 <>.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase) // 忽略字段名称的大小写 <>.IgnoreNonMapped(true); // 忽略除以上配置的所有字段 <>config.ForType<User, UserDto>() <>.IgnoreMember((member, side) =>!member.Type.Namespace.StartsWith("System")); // 实现更细致的忽略规则 <>``` <>  <>与其他对象映射库相比,Mapster 在性能和内存使用上表现较为出色。它旨在提高速度和内存效率,在一些测试中,可以获得 4 倍的性能提升,同时只使用约 1/3 的内存。 <>  <>如果你需要在.NET 项目中进行对象映射,Mapster 是一个值得考虑的选择。你可以根据项目的具体需求,利用其提供的功能来简化和优化对象之间的映射工作。更多详细信息和用法可以参考 Mapster 的官方文档:https://github.com/MapsterMapper/Mapster/wiki <> <>