AotObjectMapper.Abstractions
0.5.0
dotnet add package AotObjectMapper.Abstractions --version 0.5.0
NuGet\Install-Package AotObjectMapper.Abstractions -Version 0.5.0
<PackageReference Include="AotObjectMapper.Abstractions" Version="0.5.0" />
<PackageVersion Include="AotObjectMapper.Abstractions" Version="0.5.0" />
<PackageReference Include="AotObjectMapper.Abstractions" />
paket add AotObjectMapper.Abstractions --version 0.5.0
#r "nuget: AotObjectMapper.Abstractions, 0.5.0"
#:package AotObjectMapper.Abstractions@0.5.0
#addin nuget:?package=AotObjectMapper.Abstractions&version=0.5.0
#tool nuget:?package=AotObjectMapper.Abstractions&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
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on AotObjectMapper.Abstractions:
| Package | Downloads |
|---|---|
|
AotObjectMapper.Mapper
DotNet source generator for mapping objects with no reflection. |
GitHub repositories
This package is not used by any popular GitHub repositories.