A lightweight object mapper with fluent API supporting basic, conditional, and combine mapping
$ dotnet add package TacoMapperA very lightweight C# object mapper with a fluent API that supports basic mapping, conditional mapping, and combine mapping. The library is designed to be readable, small, and efficient.
// Simple mapping for properties with matching names and types
var personDto = ObjectMapper.Map<Person, PersonDto>(person);
var mapper = ObjectMapper.Create<Person, PersonDto>()
.Map(dest => dest.Id, src => src.Id)
.Map(dest => dest.Email, src => src.Email)
.Map(dest => dest.Age, src => src.DateOfBirth, dob => DateTime.Now.Year - dob.Year)
.Map(dest => dest.Status, src => src.IsActive, active => active ? "Active" : "Inactive")
.Combine(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");
var result = mapper.MapFrom(person);
var mapper = ObjectMapper.Create<Person, PersonDto>()
.Map(dest => dest.Id, src => src.Id)
.MapIf(dest => dest.SalaryFormatted,
src => src.Salary,
salary => $"${salary:N2}",
src => src.IsActive) // Only map salary if person is active
.Combine(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");
var mapper = ObjectMapper.Create<Address, AddressDto>()
.Map(dest => dest.Street, src => src.Street)
.Map(dest => dest.City, src => src.City)
.Map(dest => dest.ZipCode, src => src.ZipCode)
.Combine(dest => dest.FormattedAddress,
src => $"{src.Street}, {src.City} {src.ZipCode}");
var mapper = ObjectMapper.Create<Person, PersonDto>()
.Map(dest => dest.Id, src => src.Id)
.Ignore(dest => dest.Email) // Skip email mapping
.Combine(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");
var people = new List<Person> { /* ... */ };
// Using configured mapper
var mapper = ObjectMapper.Create<Person, PersonDto>()
.Map(dest => dest.Id, src => src.Id)
.Combine(dest => dest.FullName, src => $"{src.FirstName} {src.LastName}");
var results = mapper.MapFrom(people);
// Or simple auto-mapping
var simpleResults = ObjectMapper.Map<Person, PersonDto>(people);
Create<TSource, TDestination>() - Creates a new mapper instanceMap<TSource, TDestination>(source) - Simple auto-mapping for single objectMap<TSource, TDestination>(sources) - Simple auto-mapping for collectionsMap(dest, src) - Basic property mappingMap(dest, src, transform) - Property mapping with transformationMapIf(dest, src, condition) - Conditional property mappingMapIf(dest, src, transform, condition) - Conditional mapping with transformationCombine(dest, combineFunction) - Combine multiple source propertiesIgnore(dest) - Ignore a destination propertyMapFrom(source) - Execute mapping on single objectMapFrom(sources) - Execute mapping on collectionThe mapper uses:
MIT License