Skip to main content

Najlot.Map.SourceGenerator by Najlot

NuGet / site data

Nuget GitHub last commit GitHub Repo stars

Details

Info

info

Name: Najlot.Map.SourceGenerator

Source generator for Najlot.Map that provides automatic mapping code generation with high performance caching.

Author: Najlot

NuGet: https://www.nuget.org/packages/Najlot.Map.SourceGenerator/

You can find more details at https://github.com/najlot/Map

Source: https://github.com/najlot/Map

Author

note

Najlot Alt text

Original Readme

note

M Najlot.Map

Najlot.Map is a high-performance object mapping library for .NET built around explicit mapping methods. Instead of convention-heavy auto-mapping, it keeps mapping logic in normal C# methods so behavior stays readable, predictable, and easy to review. When you want less boilerplate, you can add the optional source generator and keep the same programming model.

Najlot.Map is a good fit when you want:

  • explicit mappings instead of hidden conventions,
  • strong runtime performance without magic in the hot path,
  • a single IMap entry point for object, collection, async, and queryable mapping,
  • the option to scale from handwritten methods to generated mappings.

Why Najlot.Map
  • Unlike convention-based mappers, mapping behavior lives in regular C# methods you can read, debug, and review directly.
  • Unlike tools that rely on runtime magic, Najlot.Map keeps the hot path explicit and lets you add source generation only when it helps.
  • Unlike broad auto-mapping defaults, it favors predictable registrations and validation so mapping changes are easier to catch in tests or startup checks.

What It Does
  • Explicit method-based mappings
  • Central IMap container
  • Object, collection, nullable, and async enumerable mapping
  • IQueryable<T> projections through expressions
  • Optional Roslyn source generator
  • Validation for delegate-based mappings in tests
  • Factory-based object creation for DI or custom activation

Packages

Najlot.Map is distributed as two NuGet packages:

PackageDescription
Najlot.MapCore runtime, attributes, registration, validation, and mapping APIs
Najlot.Map.SourceGeneratorOptional compile-time generation for mapping methods and registration

Installation

Install the runtime package:

dotnet add package Najlot.Map

Add the source generator when you want compile-time generated mappings:

dotnet add package Najlot.Map.SourceGenerator

Core Model
  • Mappings are regular methods, not configuration files.
  • IMap is the single entry point for registration and execution.
  • Public mapping methods can be discovered and registered automatically.
  • Generated mappings follow the same runtime API as handwritten mappings.
  • Validation is meant for tests and startup checks, not the request path.

Quick Start

######### 1. Write mapping methods

using Najlot.Map;
using Najlot.Map.Attributes;

internal class UserMappings
{
[MapIgnoreProperty(nameof(User.Password))]
public void MapModelToUser(IMap map, UserModel from, User to)
{
to.Id = from.Id;
to.Username = from.Username;
to.Features = map
.From<UserFeatureModel>(from.Features)
.ToList<UserFeature>();
}

[MapIgnoreProperty(nameof(UserModel.Password))]
public UserModel MapUserToModel(IMap map, User from) => new()
{
Id = from.Id,
Username = from.Username,
Features = map
.From<UserFeature>(from.Features)
.To<UserFeatureModel>()
};

[MapIgnoreMethod]
public Guid IgnoredMethod(UserModel from) => from.Id;
}

######### 2. Register the mappings

var map = new Map()
.Register<UserMappings>();

If your mapping classes need custom construction, register a factory:

var map = new Map()
.RegisterFactory(type => serviceProvider.GetRequiredService(type))
.Register<UserMappings>();

######### 3. Map objects and collections

var user = map.From(userModel).To<User>();
var users = map.From(userModels).To<User>().ToList();

Registration Options

######### Manual registration

Register a class and let Najlot.Map inspect its public methods:

var map = new Map()
.Register<UserMappings>();

Supported method shapes include:

void Map(TFrom from, TTo to)
void Map(IMap map, TFrom from, TTo to)
TTo Map(TFrom from)
TTo Map(IMap map, TFrom from)
Expression<Func<TFrom, TTo>> Projection()

######### Generated registration

When using Najlot.Map.SourceGenerator, classes marked with [Mapping] get picked up and the generator emits an assembly-specific extension method named Register{AssemblyName}Mappings().

var map = new Map()
.RegisterMyProjectMappings();

If generated mapping classes need constructor injection, the same RegisterFactory(...) hook applies.


Source Generator

The source generator keeps the same explicit programming model while removing repetitive mapping code.

using Najlot.Map;
using Najlot.Map.Attributes;

[Mapping]
public partial class UserMappings
{
public partial void MapUser(IMap map, UserModel from, User to);
public partial void MapFeature(IMap map, UserFeatureModel from, UserFeature to);

public DateTime ConvertToUtc(DateTimeOffset offset) => offset.UtcDateTime;
}

Usage:

var map = new Map()
.RegisterMyProjectMappings();

var user = map.From(userModel).To<User>();

Use the generator when you want to reduce boilerplate but still keep mappings explicit, typed, and reviewable.


Validation

Validate() checks registered delegate-based mappings and throws MapMissPropertiesException when destination properties are left unmapped and not explicitly ignored.

var map = new Map()
.Register<UserMappings>();

map.Validate();

Recommended usage:

  • unit tests,
  • integration tests,
  • application startup checks.

Validation does not cover expression-based mappings used for IQueryable<T> projections.


Queryable Projections

For IQueryable<T> scenarios such as Entity Framework Core, register an expression mapping so the provider can translate it.

using System.Linq.Expressions;
using Najlot.Map.Attributes;

[Mapping]
public partial class UserMappings
{
public static partial Expression<Func<User, UserListItem>> ToListItem();
}

Usage:

var map = new Map()
.RegisterMyProjectMappings();

var query = map.From(db.Users).To<UserListItem>();
var items = await query.ToListAsync();

Use delegate mappings for in-memory object graphs. Use expression mappings when the projection needs to stay provider-translatable.


Design Principles

Najlot.Map is intentionally not a convention-over-configuration auto-mapper. Its value is in making mappings obvious and controllable while still giving you enough tooling to keep the codebase fast and maintainable as it grows.

That means:

  • explicit code over implicit behavior,
  • predictable runtime behavior over hidden fallback rules,
  • optional generation over mandatory framework ceremony.

License

MIT License

About

note

Generates object mapping code at compile time using source generators

How to use

Example (source csproj, source files)

This is the CSharp Project that references Najlot.Map.SourceGenerator

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Najlot.Map" Version="0.2.1" />
<PackageReference Include="Najlot.Map.SourceGenerator" Version="0.2.1" />
</ItemGroup>






</Project>

Generated Files

Those are taken from $(BaseIntermediateOutputPath)\GX

// <auto-generated/>
#nullable enable

namespace mapperDemo
{
partial class UserMapper
{
public partial mapperDemo.PersonDTO MapUser(Person from)
{
var result = new mapperDemo.PersonDTO();

result.FirstName = from.FirstName;
result.LastName = from.LastName;

return result;
}

}
}

Useful

Download Example (.NET C#)

Share Najlot.Map.SourceGenerator

https://ignatandrei.github.io/RSCG_Examples/v2/docs/Najlot.Map.SourceGenerator

Category "Mapper" has the following generators:

1 AutoDTO Nuget GitHub Repo stars 2023-08-24

2 AutoGen Nuget GitHub Repo stars 2024-02-22

3 DynamicsMapper Nuget GitHub Repo stars 2023-10-16

4 Facet Nuget GitHub Repo stars 2025-08-17

5 LightweightObjectMapper Nuget GitHub Repo stars 2024-09-18

6 lomapper Nuget GitHub Repo stars 2026-04-07

7 MagicMap Nuget GitHub Repo stars 2023-10-08

8 mapperly Nuget GitHub Repo stars 2023-04-16

9 MapTo Nuget GitHub Repo stars 2023-10-05

10 Najlot.Map.SourceGenerator Nuget GitHub Repo stars 2026-08-29

11 NextGenMapper Nuget GitHub Repo stars 2023-08-16

See category

Mapper