# MapTo ![Nuget](https://img.shields.io/nuget/v/mapto?logo=nuget) ![Publish Packages](https://github.com/mrtaikandi/MapTo/workflows/Publish%20Packages/badge.svg) A convention based object to object mapper using [Roslyn source generator](https://github.com/dotnet/roslyn/blob/master/docs/features/source-generators.md). MapTo creates mappings during compile-time, which eliminates the need for using reflection to create the mappings. This makes it super simple to use and way faster than other libraries. ## Installation ``` dotnet add package MapTo --prerelease ``` ## Usage To generate the mappings, simply declare the destination class as `partial` and annotate it with `MapFrom` attribute. ```c# using MapTo; namespace App.ViewModels { [MapFrom(typeof(App.Data.Models.User))] public partial class UserViewModel { public string FirstName { get; } public string LastName { get; } [IgnoreProperty] public string FullName { get; set; } } } ``` ## Generated Source In the above example, if `App.Data.Models.User` class is defined as: ```c# namespace App.Data.Models { public class User { public User(int id) => Id = id; public int Id { get; } public string FirstName { get; set; } public string LastName { get; set; } public string FullName => $"{FirstName} {LastName}"; } } ``` It will generate the following code: ```c# // using System; namespace App.ViewModels { public partial class UserViewModel { public UserViewModel(App.Data.Models.User user) { if (user == null) throw new ArgumentNullException(nameof(user)); FirstName = user.FirstName; LastName = user.LastName; } public static UserViewModel From(App.Data.Models.User user) { return user == null ? null : new UserViewModel(user); } } public static partial class UserToUserViewModelExtensions { public static UserViewModel ToUserViewModel(this App.Data.Models.User user) { return user == null ? null : new UserViewModel(user); } } } ``` Which makes it possible to get an instance of `UserViewModel` from one of the following ways: ```c# var user = new User(id: 10) { FirstName = "John", LastName = "Doe" }; var vm = user.ToUserViewModel(); // OR vm = new UserViewModel(user); // OR vm = UserViewModel.From(user); ```