102 lines
2.4 KiB
Markdown
102 lines
2.4 KiB
Markdown
# MapTo
|
|
![Nuget](https://img.shields.io/nuget/v/mapto?logo=nuget)
|
|
![Publish Packages](https://github.com/mrtaikandi/MapTo/workflows/Publish%20Packages/badge.svg)
|
|
|
|
An object to object mapping generator 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 like other libraries. 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#
|
|
// <auto-generated />
|
|
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);
|
|
``` |