AotObjectMapper.Mapper
0.5.0
dotnet add package AotObjectMapper.Mapper --version 0.5.0
NuGet\Install-Package AotObjectMapper.Mapper -Version 0.5.0
<PackageReference Include="AotObjectMapper.Mapper" Version="0.5.0" />
<PackageVersion Include="AotObjectMapper.Mapper" Version="0.5.0" />
<PackageReference Include="AotObjectMapper.Mapper" />
paket add AotObjectMapper.Mapper --version 0.5.0
#r "nuget: AotObjectMapper.Mapper, 0.5.0"
#:package AotObjectMapper.Mapper@0.5.0
#addin nuget:?package=AotObjectMapper.Mapper&version=0.5.0
#tool nuget:?package=AotObjectMapper.Mapper&version=0.5.0
AotObjectMapper
AotObjectMapper is a C# Roslyn source generator for compile-time object mapping.
This project was created primarily as a personal learning exercise and proof of concept. And may not be suitable for production use until v1.0.0
The main goals of this project are:
- Gaining hands-on experience with Roslyn incremental source generators
- Designing an AOT- and trimming-friendly alternative to reflection-based mappers
- Providing feature parity with mature mapping libraries such as AutoMapper or Mapster
- Exploring compile-time code generation, diagnostics, and analyzers
- Experimenting with API design and developer experience in attribute driven tooling
- Handling complex mapping scenarios such as recursion, reference preservation, enum strategies, and custom member mappings
<p align="center"> <img src="/docs/static/banner1280x640.png" alt="AotObjectMapper banner" height="256"> </p>
Installation
AotObjectMapper is distributed as a NuGet package.
Via .NET CLI
dotnet add package AotObjectMapper
Via Visual Studio
Right-click your project → Manage NuGet Packages
Search for AotObjectMapper
Install the latest version
Both methods will automatically add AotObjectMapper.Abstractions.
Quick Start
class User
{
public required Guid Id { get; set; }
public required string FirstName { get; set; }
public string? MiddleName { get; set; }
public required string LastName { get; set; }
public required DateTimeOffset DateOfBirth { get; set; }
public required string Secret { get; set; }
}
public class UserDto
{
public Guid Id { get; set; }
public string FirstName { get; set; } = String.Empty;
public string? MiddleName { get; set; }
public string LastName { get; set; } = String.Empty;
public int DayOfBirth { get; set; }
public int MonthOfBirth { get; set; }
public int YearOfBirth { get; set; }
public TimeOnly TimeOfBirth { get; set; }
}
[GenerateMapper]
[Map<User, UserDto>]
public partial class UserMapper;
When the project is built, the mapper will generate a static Map method on UserMapper which will map Id, FirstName, MiddleName and LastName.
The remaining members cannot be mapped automatically because they differ in type and/or name, or do not exist on one of the classes. This can be fixed using mapper configuration which is all covered in the documentation.
Multiple Map attributes can be added to a single mapper class:
[GenerateMapper]
[Map<User, UserDto>, Map<UserDto, User>]
public partial class UserMapper;
Other Features
Ignore Members
- Skip specific members in a mapping using
ignoredMemberson[Map].
- Skip specific members in a mapping using
IConvertible Member Mapping
- Automatically maps members implementing
IConvertiblewith optional format providers.
- Automatically maps members implementing
Mapper Context
- Optional MapperContext tracks depth, reference reuse, and additional data
- Supports nested mappings, reference preservation, and contextual operations
Manual Member Mapping
- Override mapping for specific members using
[ForMember<TSource, TDestination>]. SupportsMapperContext.
- Override mapping for specific members using
Enum Mapping
- Map by name (default)
- Map by value (
MappingOptions.MapEnumsByValue) - Throw exceptions for unmapped values (
MappingOptions.ThrowExceptionOnUnmappedEnum)
Nested Object Mapping
- Use
[UseMap<TMapper, TSource, TDestination>]to compose complex object graphs - Optionally consolidate multiple
[Map]into a single mapper - Reference Preservation
- Prevent infinite loops for circular references using
MappingOptions.PreserveReferences. - Ensures the same source object is mapped once per operation.
- Prevent infinite loops for circular references using
- Use
Pre/Post Mapping Hooks
- Run logic before or after mapping with
[PreMap<TSource, TDestination>]and[PostMap<TSource, TDestination>].
- Run logic before or after mapping with
Multiple Map Configurations
- Multiple
[Map]attributes per mapper - Separate mapper classes or single consolidated mapper for layered mapping
- Multiple
Customizable and Extensible
- Full control over conversions, member handling, and mapping behavior while maintaining compile-time safety.
For more information visit the Docs
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- AotObjectMapper.Abstractions (>= 0.5.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.