AutoMapperAnalyzer.Analyzers
2.30.0
dotnet add package AutoMapperAnalyzer.Analyzers --version 2.30.0
NuGet\Install-Package AutoMapperAnalyzer.Analyzers -Version 2.30.0
<PackageReference Include="AutoMapperAnalyzer.Analyzers" Version="2.30.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="AutoMapperAnalyzer.Analyzers" Version="2.30.0" />
<PackageReference Include="AutoMapperAnalyzer.Analyzers"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add AutoMapperAnalyzer.Analyzers --version 2.30.0
#r "nuget: AutoMapperAnalyzer.Analyzers, 2.30.0"
#:package AutoMapperAnalyzer.Analyzers@2.30.0
#addin nuget:?package=AutoMapperAnalyzer.Analyzers&version=2.30.0
#tool nuget:?package=AutoMapperAnalyzer.Analyzers&version=2.30.0
๐ฏ AutoMapper Roslyn Analyzer
โจ Catch AutoMapper configuration errors before they cause runtime chaos
A sophisticated Roslyn analyzer that transforms AutoMapper development from reactive debugging to proactive prevention
๐ Latest Release: v2.30.0
Fixer Hardening โ safer actions for collections, fuzzy matches, and multi-diagnostic maps
โ Highlights
- Fixed AM021 simple collection conversions for
Queue<T>andStack<T>so the suggested code now matches the destination collection shape. - Fixed AM001 so multiple type mismatches on the same
CreateMapexpose stable, per-property actions instead of only handling the first diagnostic. - Tightened AM006 and AM011 fuzzy matching to offer a mapping action only when there is a unique best candidate.
- Removed AM005 rename-based lightbulbs and kept the explicit executable mapping action only.
- Added targeted regression coverage for action ordering, ambiguous fuzzy matches, and queue/stack conversion fixes.
๐งช Validation
- Full solution builds passed in
Release. - Full test suite passed with
635passing and8skipped. - Release validation covered targeted fixer regressions plus full Release build/test passes before tagging.
Recent Releases
- v2.29.0: Smart primary fix and reduced fixer noise across the main data-integrity fixers.
- v2.28.2: False-positive reduction, fixer UX improvements, and release workflow hardening.
- v2.28.1: Case-aware AM021 suppression and fixer reliability improvements.
- v2.28.0: Analyzer logic fixes and performance improvements.
- v2.27.0: AM050 nullable safety fix and broad regression coverage expansion.
- v2.25.0: Code-fix consolidation and sample verification.
๐ Why This Matters
AutoMapper is powerful, but silent failures are its Achilles' heel. Properties that don't map, type mismatches that throw at runtime, nullable violations that cause NullReferenceExceptionsโthese issues typically surface in production, not during development.
This analyzer changes that equation entirely.
// Before: ๐ฐ Runtime surprise!
public void MapUserData()
{
var user = mapper.Map<UserDto>(userEntity);
// ๐ฅ NullReferenceException in production
// ๐ฅ Data loss from unmapped properties
// ๐ฅ Type conversion failures
}
// After: ๐ก๏ธ Compile-time confidence!
public void MapUserData()
{
var user = mapper.Map<UserDto>(userEntity);
// โ
All mapping issues caught at compile-time
// โ
Code fixes suggest proper solutions
// โ
Ship with confidence
}
โก Quick Start
# Install via .NET CLI
dotnet add package AutoMapperAnalyzer.Analyzers
# Or via Package Manager Console
Install-Package AutoMapperAnalyzer.Analyzers
That's it! The analyzer automatically activates and starts checking your AutoMapper configurations. Open any file with AutoMapper mappings and see diagnostics appear instantly.
See it work:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<User, UserDto>();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AM001: Property 'Age' type mismatch
// ๐ก Press Ctrl+. for code fix suggestions
});
๐ What You Get
๐ก๏ธ Complete Type Safety
- AM001: Property type mismatches with smart conversion suggestions
- AM002: Nullable-to-non-nullable mapping with null safety patterns
- AM003: Collection type incompatibility detection
๐ Zero Data Loss
- AM004: Missing destination properties (prevent silent data loss)
- AM006: Unmapped destination properties (detect unintentional defaults)
- AM011: Required property validation (avoid runtime exceptions)
- AM005: Case sensitivity issues (cross-platform reliability)
๐งฉ Complex Mapping Intelligence
- AM020: Nested object mapping validation with CreateMap suggestions (supports internal properties & cross-profile detection)
- AM021: Collection element type analysis with conversion strategies
- AM022: Circular reference detection with MaxDepth recommendations
- AM030: Custom type converter analysis with null safety validation
โก Instant Code Fixes
Every analyzer comes with intelligent code fixes that don't just identify problemsโthey solve them:
// Problem detected โ ๏ธ
cfg.CreateMap<Source, Dest>();
// ~~~~~~~~~~~~~~~~~~~~~~~~~ AM001: Property 'Age' type mismatch
// Code fix applied โจ
cfg.CreateMap<Source, Dest>()
.ForMember(dest => dest.Age, opt => opt.MapFrom(src =>
int.TryParse(src.Age, out var age) ? age : 0));
๐ฏ Real-World Impact
| Before | After | |
|---|---|---|
| ๐ | Runtime mapping failures | โ Compile-time validation |
| ๐ | Manual debugging sessions | โ Instant error highlights |
| ๐ | Guessing correct configurations | โ Code fixes with best practices |
| โ ๏ธ | Production NullReferenceExceptions | โ Null safety enforcement |
| ๐ | Silent data loss | โ Missing property detection |
| ๐ | Cross-platform mapping inconsistencies | โ Case sensitivity validation |
๐ฆ Installation
.NET CLI (Recommended)
dotnet add package AutoMapperAnalyzer.Analyzers
Package Manager Console
Install-Package AutoMapperAnalyzer.Analyzers
Project File (For CI/CD)
<PackageReference Include="AutoMapperAnalyzer.Analyzers" Version="2.30.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
โก Universal Compatibility
| Platform | Version | Support | AutoMapper | CI/CD Status |
|---|---|---|---|---|
| .NET Framework | 4.8+ | ๐ข Full | 10.1.1+ | โ Tested |
| .NET | 6.0+ | ๐ข Full | 12.0.1+ | โ Tested |
| .NET | 8.0+ | ๐ข Full | 14.0.0+ | โ Tested |
| .NET | 9.0+ | ๐ข Full | 14.0.0+ | โ Tested |
| .NET | 10.0+ | ๐ข Full | 14.0.0+ | โ Tested |
Analyzer targets .NET Standard 2.0 for maximum compatibility
All platforms validated in automated CI/CD pipeline
๐จ See It In Action
โ The Problems
public class UserEntity
{
public int Id { get; set; }
public string? FirstName { get; set; } // Nullable
public string LastName { get; set; }
public string Email { get; set; }
public DateTime CreatedAt { get; set; }
public List<string> Tags { get; set; } // Collection type
public Address HomeAddress { get; set; } // Complex object
}
public class UserDto
{
public int Id { get; set; }
public string FirstName { get; set; } // Non-nullable!
public string FullName { get; set; } // Different property!
public string Age { get; set; } // Different type!
public HashSet<int> Tags { get; set; } // Incompatible collection!
public AddressDto HomeAddress { get; set; } // Needs explicit mapping!
}
// This configuration has MULTIPLE issues:
cfg.CreateMap<UserEntity, UserDto>();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ๐จ AM002: FirstName nullableโnon-nullable (NullReferenceException risk)
// ๐จ AM004: LastName will not be mapped (data loss)
// ๐จ AM001: Age expects int but gets DateTime (runtime exception)
// ๐จ AM021: Tags List<string>โHashSet<int> incompatible (mapping failure)
// ๐จ AM020: HomeAddressโAddressDto needs CreateMap (runtime exception)
โ The Solutions (Auto-Generated!)
// Code fixes automatically suggest:
cfg.CreateMap<UserEntity, UserDto>()
.ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName ?? ""))
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"))
.ForMember(dest => dest.Age, opt => opt.MapFrom(src =>
DateTime.Now.Year - src.CreatedAt.Year))
.ForMember(dest => dest.Tags, opt => opt.MapFrom(src =>
src.Tags.Select((tag, index) => index).ToHashSet()));
// Separate mapping for complex types
cfg.CreateMap<Address, AddressDto>();
โ๏ธ Fine-Tuned Control
Severity Configuration (.editorconfig)
# Treat type safety as build errors
dotnet_diagnostic.AM001.severity = error
dotnet_diagnostic.AM002.severity = error
dotnet_diagnostic.AM011.severity = error
# Data loss warnings
dotnet_diagnostic.AM004.severity = warning
dotnet_diagnostic.AM005.severity = warning
# Suggestions for optimization
dotnet_diagnostic.AM020.severity = suggestion
dotnet_diagnostic.AM021.severity = suggestion
Selective Suppression
// Suppress with clear justification
#pragma warning disable AM001 // Custom IValueConverter handles stringโint
cfg.CreateMap<Source, Dest>();
#pragma warning restore AM001
// Method-level suppression
[SuppressMessage("AutoMapper", "AM004:Missing destination property",
Justification = "PII data intentionally excluded for GDPR compliance")]
public void ConfigureSafeUserMapping() { }
๐ Complete Analyzer Coverage
| Rule | Description | Analyzer | Code Fix | Severity |
|---|---|---|---|---|
| ๐ Type Safety | ||||
| AM001 | Property Type Mismatch | โ | โ | Warning |
| AM002 | NullableโNon-nullable | โ | โ | Warning |
| AM003 | Collection Incompatibility | โ | โ | Warning |
| ๐ Data Integrity | ||||
| AM004 | Missing Destination Property | โ | โ | Info |
| AM005 | Case Sensitivity Issues | โ | โ | Info |
| AM006 | Unmapped Destination Property | โ | โ | Info |
| AM011 | Required Property Missing | โ | โ | Error |
| ๐งฉ Complex Mappings | ||||
| AM020 | Nested Object Issues | โ | โ | Warning |
| AM021 | Collection Element Mismatch | โ | โ | Warning |
| AM022 | Circular Reference Risk | โ | โ | Warning |
| AM030 | Custom Type Converter Issues | โ | โ | Warning |
| โก Performance | ||||
| AM031 | Performance Warnings | โ | โ | Warning |
| โ๏ธ Configuration | ||||
| AM041 | Duplicate Mapping Registration | โ | โ | Warning |
| AM050 | Redundant MapFrom | โ | โ | Info |
| ๐ Future | ||||
| AM032+ | Advanced Null Propagation | ๐ฎ | ๐ฎ | - |
| AM040+ | Configuration Rules | ๐ฎ | ๐ฎ | - |
| AM050+ | Advanced Optimizations | ๐ฎ | ๐ฎ | - |
๐ ๏ธ Development Experience
IDE Integration
- Visual Studio: Full IntelliSense integration with lightbulb code fixes
- VS Code: Rich diagnostic experience via OmniSharp
- JetBrains Rider: Native analyzer support with quick-fix suggestions
- Command Line: Works seamlessly with
dotnet build
Testing Your Configuration
# Quick validation
dotnet build # Analyzer runs automatically
# Comprehensive testing
git clone https://github.com/georgepwall1991/automapper-analyser.git
cd automapper-analyser
dotnet run --project samples/AutoMapperAnalyzer.Samples
# See all analyzer warnings in action
dotnet build samples/ --verbosity normal
# Run full test suite with coverage
dotnet test --collect:"XPlat Code Coverage" --settings coverlet.runsettings
CI/CD & Quality Assurance
- ๐ Automated Testing: Every commit tested across multiple .NET versions
- ๐ Code Coverage: Integrated with Codecov for comprehensive coverage tracking
- ๐ก๏ธ Quality Gates: Build fails only on genuine errors, warnings are preserved
- โก Cross-Platform: Validated on Ubuntu (CI) and Windows (compatibility tests)
- ๐ Performance: Incremental builds with analyzer caching for optimal speed
๐๏ธ Architecture Highlights
This isn't just another analyzerโit's built for enterprise-grade reliability:
- ๐๏ธ Performance-First: Incremental analysis with minimal IDE impact
- ๐ง Extensible Design: Clean plugin architecture for new rules
- ๐งช Battle-Tested: release validation includes full suite coverage plus targeted regression tests for high-risk fixers
- ๐ Cross-Platform: Identical behavior on Windows, macOS, Linux
- โก CI/CD Ready: Automated GitHub Actions with codecov integration
- ๐ Code Coverage: 55%+ coverage with comprehensive testing
๐ฏ What's Next
Recently Completed โ
- v2.30.0: Fixer hardening for AM001, AM005, AM006, AM011, and AM021 with safer action selection
- v2.29.0: Smart Primary Fix โ reduced fixer noise to max 2 lightbulb options per diagnostic
- v2.28.2: False-positive reduction, fixer UX improvements, and release workflow hardening
- v2.28.1: Case-aware AM021 suppression and fixer accuracy improvements
- v2.28.0: Analyzer logic fixes and performance improvements
- v2.27.0: AM050 nullable safety fix and expanded regression coverage
Phase 5B: Enhanced Analysis (Upcoming)
- AM032: Advanced null propagation patterns with smart fixes
Phase 6: Configuration & Profile Analysis
- AM040: Profile registration analysis and auto-registration fixes
Beyond Code Analysis
- NuGet Package Templates: Project templates with pre-configured analyzers
- MSBuild Integration: Custom build targets for mapping validation
- Documentation Generation: Auto-generate mapping documentation
- Metrics Dashboard: Build-time analysis reporting
๐ค Contributing
We're building something special, and your expertise makes it better.
Quick Start Contributing:
git clone https://github.com/georgepwall1991/automapper-analyser.git
cd automapper-analyser
dotnet test
What We Need:
- ๐งช More edge-case scenarios
- ๐ Documentation improvements
- ๐ Performance optimizations
- ๐ก New analyzer rule ideas
See our Contributing Guide for detailed guidelines.
๐ Deep Dive Resources
- ๐ Architecture Guide - How it all works under the hood
- ๐ Diagnostic Rules - Complete rule reference
- ๐งช Sample Gallery - Real-world scenarios
- ๐ CI/CD Pipeline - Our build and deployment process
- ๐ Compatibility Matrix - Framework support details
๐ฌ Community & Support
Get Help:
- ๐ Issues - Bug reports and feature requests
- ๐ฌ Discussions - Questions and ideas
- ๐ Wiki - Comprehensive documentation
๐ License
MIT License - Use it anywhere, contribute back if you can.
<div align="center">
โญ Star this repo if it's saving you time!
Built with โค๏ธ by developers who've debugged too many AutoMapper issues
๐ Get Started Now โข ๐ Read the Docs โข ๐ฌ **Join the Discussion **
</div>
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.30.0 | 0 | 3/13/2026 |
| 2.29.0 | 31 | 3/12/2026 |
| 2.28.2 | 39 | 3/12/2026 |
| 2.28.1 | 68 | 3/11/2026 |
| 2.28.0 | 93 | 2/19/2026 |
| 2.27.0 | 96 | 2/8/2026 |
| 2.26.0 | 92 | 2/8/2026 |
| 2.25.0 | 99 | 2/8/2026 |
| 2.22.0 | 94 | 2/8/2026 |
| 2.21.0 | 98 | 2/8/2026 |
| 2.20.0 | 93 | 2/8/2026 |
| 2.19.0 | 91 | 2/8/2026 |
| 2.18.0 | 96 | 2/8/2026 |
| 2.17.0 | 89 | 2/8/2026 |
| 2.16.0 | 92 | 2/8/2026 |
| 2.15.0 | 85 | 2/6/2026 |
| 2.14.0 | 80 | 2/6/2026 |
| 2.13.0 | 80 | 2/6/2026 |
| 2.12.0 | 79 | 2/6/2026 |
| 2.11.0 | 166 | 2/6/2026 |
Version 2.30.0 - Fixer hardening and safer action selection
Fixes:
- Fixed AM021 queue and stack collection-element conversions to generate compilable constructor-based mappings
- Fixed AM001 so multi-diagnostic CreateMap sites register stable per-property actions instead of only the first mismatch
- Hardened AM006 and AM011 fuzzy matching to require a unique best candidate before offering speculative mapping actions
- Removed AM005 source-property rename suggestions and kept the executable explicit-mapping action only
Validation:
- Full solution builds in Release
- Full analyzer test suite passing in Release with targeted fixer regression coverage
Previous Release: v2.29.0 - smart primary fix and reduced fixer noise