Changelog

Release history for AutoMapperLite, verified against the package's actual published history on NuGet. Full detail also maintained in CHANGELOG.md.

4.4.1 current release — 2026-09-17

Bug fix, feature addition, and documentation fixes. Same-name nested collection destination properties now also accept an array (T[]) destination, matching the array support the top-level Map<TDestination>(object) API already had since 4.4.0.

  • Fixed: a ForPath mapping targeting a leaf property that legitimately resolves to null (e.g. an optional string) either lost that null to a freshly-constructed instance, or — for a leaf type with no public parameterless constructor reachable via reflection, most commonly string itself — threw InvalidOperationException outright. The nested-path walk tried to descend one segment past the actual leaf; only intermediate segments need that. See Guide → Deep nested paths.
  • Added: a List<TSource> source property mapping into a TDest[] destination property (with a registered map for the item types) is now populated, the same way a List<T>- or interface-typed nested collection property already was — previously it was silently left unmapped, the same as any other unregistered type mismatch. Purely additive: no previously-mapped output changes. See API Reference and Examples → Nested collection properties.
  • Documentation fixes (no code-behavior changes): destination construction described accurately as a compiled constructor call (Expression.New) rather than Activator.CreateInstance in the guide and FAQ; the home page's comparison FAQ answer no longer claims AutoMapperLite trails AutoMapper on collections (it has beaten AutoMapper there since 4.4.0); the FAQ's visible AutoMapper-comparison answer no longer contradicts its own structured data by claiming "no compiled-expression engine"; SECURITY.md's supported-version table no longer references 4.2.x, a version that was never published to NuGet; this page's own performance explainer no longer overstates Activator.CreateInstance's elimination (it's still used by the interpreted ForPath walk and the untyped collection-dispatch fallback, just not the compiled per-property path).
  • CI: the GitHub Actions publish workflow has been removed; releases are packed and pushed to NuGet manually.
  • No public API breaking changes since 4.0.2.

4.4.0 — 2026-09-03

Mapping engine and performance redesign. Each source/destination type pair now compiles into a cached delegate via System.Linq.Expressions on first use, instead of being interpreted through reflection. Dispatch, collection element resolution, and nested same-name property mapping are all resolved once and cached rather than re-resolved per call. See Performance for full measured results.

  • Added: IMapper.Map<TSource, TDestination>(TSource source) — a strongly-typed overload for call sites where the source type is known at compile time. This is the fastest way to call AutoMapperLite, and now also works directly for collections: mapper.Map<List<TSourceItem>, List<TDestItem>>(sourceList) skips resolving the source collection's runtime type.
  • Added: collection destinations are no longer limited to List<T>. Map<TDestination>(object) now also accepts T[], IList<T>, ICollection<T>, IReadOnlyList<T>, IReadOnlyCollection<T>, and IEnumerable<T>. The same flexibility applies to same-name nested collection properties.
  • Performance: fixed a collection-loop interface-dispatch cost that was limiting collection-mapping throughput — casting the source to IEnumerable<T> and using foreach forced List<T>'s own struct enumerator to be boxed through the interface on every call. The loop now indexes List<T>/arrays directly. Measured: a 100-item collection dropped from ~1.3 µs to ~0.78 µs (object API) / ~0.67 µs (generic API); a 5,000-item collection dropped from ~60–74 µs to ~35 µs. AutoMapperLite now beats AutoMapper on collection mapping at every size from 1,000 items upward (previously it trailed), and at 100,000 items is within 8% of hand-written manual mapping's own time. See Performance for full figures.
  • Disclosed behavior change: exceptions raised during mapping now propagate directly as InvalidOperationException instead of being wrapped in System.Reflection.TargetInvocationException.
  • Disclosed behavior change: List<T> mapping resolves the item map from the source collection's declared item type rather than each element's runtime type.
  • Allocations for simple, medium, nested, and deeply-nested object mapping now match hand-written manual mapping exactly. Collection mapping allocation now matches manual mapping/Mapster exactly via the generic API, from 10 items to 100,000.
  • No public API breaking changes since 4.0.2 (only for anyone implementing IMapper directly rather than using the built-in Mapper class, due to the new interface member above).
  • Not currently flagged deprecated on NuGet. Engineering notes elsewhere refer to intermediate 4.1.0/4.2.0/4.3.0 milestones — those were internal-only labels for stages of this work and were never independently published; only 4.4.0 shipped.

4.0.2 — 2026-08-29

Development resumed on this date after the project had been dormant since the 3.2.1 release on 2025-07-09 — a gap of roughly 13.5 months. Not currently flagged deprecated on NuGet, despite being superseded by 4.4.0.

Published NuGet release notes:

  • Fixed: updated test tooling (xunit.v3, Microsoft.NET.Test.Sdk 18.9.0) only supports net8.0+ — AutoMapperLite.Tests now targets net8.0/net9.0/net10.0 (the library itself is unaffected and still targets net6.0-net10.0)
  • Fixed: a Microsoft Testing Platform v2 change dropped dotnet test's legacy VSTest bridge on the .NET 10 SDK — a repo-root global.json now opts into native MTP mode
  • Fixed: Activator.CreateInstance failures (e.g. mapping to a positional record with no parameterless constructor) now throw a clear InvalidOperationException naming the type, instead of a bare MissingMethodException
  • Added real, measured BenchmarkDotNet comparisons against manual mapping, AutoMapper 16.2.0, and Mapster 10.0.12 — see Performance. AutoMapperLite was not the fastest of the four at this point; docs and package description no longer implied otherwise
  • Verified and documented previously-untested behaviors: null source properties are skipped (not assigned), auto-map requires an exact type match, and records with a parameterless constructor + init-only properties map correctly

Also carried in this release (confirmed from this repo's own commit history, not itemized in the terse NuGet notes above, and never split out as its own package):

  • Now multi-targets net6.0-net10.0 (the 3.0.1-3.2.1 line published in 2025 was net8.0-only)
  • Fixed: mapping to a value-type (struct) destination silently produced an unpopulated struct
  • Fixed: a List<T> destination property was never auto-mapped even when a map was registered for the item types
  • Fixed: multiple ForPath calls under the same top-level destination property now all apply, instead of only the first
  • Hardened MapperConfig and DI registration for concurrent use; reduced mapping-hot-path allocations and reflection overhead
  • Added the static HTML documentation site, official rebrand, full XML documentation on the public API, and overhauled NuGet package metadata

This work passed through the local version numbers 3.0.2 (reused from the 2025 line), 3.0.3, and 4.0.1 in this repo's commit history over the course of one day before actually being packed and published — none of those three numbers were ever independently published to NuGet; 4.0.2 is the only release that resulted from this line of work.

3.2.1 — 2025-07-09 deprecated (critical bugs)

Published and listed on NuGet. Depends on Microsoft.Extensions.DependencyInjection.Abstractions 9.0.7. Release notes identical, verbatim, to 2.0.4's below.

3.1.1 — 2025-07-09 deprecated (critical bugs)

Published and listed on NuGet. Same dependency and release notes as 3.2.1.

3.0.2 — 2025-07-09 deprecated (critical bugs)

Published and listed on NuGet. Same release notes as 2.0.4. Not the same release as the "3.0.2" version number that briefly existed locally in this repo during the 2026-08-29 development session (never published — see the 4.0.2 entry above); this is the real, originally-published 3.0.2 from 2025.

3.0.1 — 2025-07-05 deprecated (critical bugs)

Published but unlisted on NuGet (hidden from search, still installable by exact version). Same release notes as 2.0.4.

2.0.8 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Same release notes as 2.0.4.

2.0.7 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Same release notes as 2.0.4.

2.0.6 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Same release notes as 2.0.4.

2.0.5 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Same release notes as 2.0.4.

2.0.4 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Release notes as published:

  • Added ForPath and ForMember support
  • Improved collection mapping (List<T>)
  • Simplified usage with Map<TDestination>(TSource) format
  • Support for nested property mapping and configuration profiles
  • Refactored internal Mapper logic and added DI support

This exact text was then republished verbatim, unchanged, through the next eight releases (2.0.5 through 3.2.1) — a real quirk of the published history, not a transcription error here.

2.0.3 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. No release notes were published for this version. Added a package icon (icon.png).

2.0.1 — 2025-07-05 deprecated (critical bugs)

Published but unlisted. Retargeted from net6.0 to net8.0 and added a dependency on Microsoft.Extensions.DependencyInjection.Abstractions 9.0.6. Release notes as published: “Initial release of AutoMapperLite v2.0.1. Dependency Injection (DI) support. Nested model mapping support. Lightweight and reflection-based. No third-party dependencies.” (The “no third-party dependencies” line is as originally published; it's already in tension with the DI Abstractions dependency added in this same version.)

1.0.0 — 2025-07-03 deprecated (critical bugs)

The first published release. Targeted net6.0 only, with no DI package dependency. Published but unlisted. No release notes were published for this version.