Popularity
5.9
Growing
Activity
6.9
Declining
817
27
64

Description

"AutoMapper" like, Roslyn based, code fix provider that allows generating mapping code in design time. The main features are: generating the implementation of mapping methods and constructors, clone methods and lambda projections. There are also a few additional features like splatting or completing method invocation and object initialization with local variables. You can download it as Visual Studio Extension from Visual Studio Marketplace.

Programming language: C#
License: MIT License
Latest version: v1.20.463

Mapping Generator alternatives and similar packages

Based on the "Object to object mapping" category.
Alternatively, view Mapping Generator alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Mapping Generator or a related project?

Add another 'Object to object mapping' Package

README

Mapping Generator Tweet

Branch Status
Master Build status
Develop Build status

"AutoMapper" like, Roslyn based, code fix provider that allows to generate mapping code in design time.

You can download it as Visual Studio Extension from Visual Studio Marketplace.

Motivation

The reasons behind why I don't use AutoMapper

Further Development

If you find this extension useful (you feel it helps you on the daily basis) you can support further development by buying me a coffee (it's simple, just click the button below). Sometimes it's hard to stay awake till midnight implementing new features, coffee helps me with that. . I really appreciate your support in any form.

support guide

Contributing

Before you start any contributing work, please read the contribution guidline

Supported IDE

VisualStudio.

Install as VSIX from Market place or as a NuGet package. Verify your Roslyn integration option in case you are using R#.

JetBrains Rider

Install as a NuGet package

VSCode

Install as a NuGet package or use this instruction to install from VSIX

Using along with Resharper

If you are not able to open Roslyn refactoring menu (ctr + .) please verify your Resharper settings related to Visual Studio Integration or Visual Studio code analysis (depends on the R# version). For more information please check #50

[resharper settings](doc/resharper_settings.jpg)

Main features

Generate mapping method body

Pure mapping method

Non-void method that takes single parameter

public UserDTO Map(UserEntity entity)
{

}

[Generating pure mapping method implementation](doc/pure_mapping_method_newone.gif)

Updating method

Void method that takes two parameters

public void Update(UserDTO source, UserEntity target)
{

}

[Generating update method implementation](doc/update_method.gif)

Mapping Constructor

Constructor method that takes single complex parameter

public UserDTO(UserEntity user)
{

}

[Generating mapping constructor implementation](doc/mapping_constructor.gif)

Constructor method that takes more than one parameter

public UserDTO(string firstName, string lastName, int age, int cash)
{
}

Generating multi-parameter constructor

Updating member method

Void member method that takes single parameter

public void UpdateWith(UserEntity en)
{

}

[Generating update member method imeplementation](doc/update_member_method.gif)

Void member method with more than one parameter

public void Update(string firstName, string lastName, int age)
{
}

Generate inline code for fixing Compiler Errors:

CS0029 Cannot implicitly convert type 'type' to 'type'

cs0029

CS0266 Cannot implicitly convert type 'type1' to 'type2'. An explicit conversion exists (are you missing a cast?)

cs0266

CS7036 There is no argument given that corresponds to the required formal parameter

CS7036

Other mappings

  • Complete empty initialization block [Generate initialization bloc](doc/emptyInitialization.gif)

  • Complete empty initialization block in lambda expression Expression<Func<T,T2>> = (T) => new T2{} initialization block in lambda expression

  • Provide local accessible variables as parameters for method and constructor invocation [locals as parameters](doc/localsforconstructor.gif)

  • Create missing mapping lambda
    [mapping lambda](doc/mapping_lambda.gif)

  • Generate ICloneable interface implementation generate clone method

Object scaffolding

sample scaffolding

Mapping rules

  • Mapping Property-To-Property csharp target.FirstName = source.FirstName; target.LastName = source.LastName;
  • Mapping Method Call-To-Property csharp target.Total = source.GetTotal()
  • Flattening with sub-property csharp target.UnitId = source.Unit.Id
  • Mapping complex property csharp target.MainAddress = new AddressDTO(){ BuildingNo = source.MainAddress.BuildingNo, City = source.MainAddress.City, FlatNo = source.MainAddress.FlatNo, Street = source.MainAddress.Street, ZipCode = source.MainAddress.ZipCode };
  • Mapping collections csharp target.Addresses = source.Addresses.Select(sourceAddresse => new AddressDTO(){ BuildingNo = sourceAddresse.BuildingNo, City = sourceAddresse.City, FlatNo = sourceAddresse.FlatNo, Street = sourceAddresse.Street, ZipCode = sourceAddresse.ZipCode }).ToList().AsReadOnly();
  • Unwrapping wrappers csharp customerEntity.Kind = cutomerDTO.Kind.Selected;
    public enum CustomerKind
    {
        Regular,
        Premium
    }

    public class Dropdown<T>
    {
        public List<T> AllOptions { get; set; }

        public T Selected { get; set; }
    }

    public class CustomerDTO
    {
        public string Name { get; set; }
        public Dropdown<CustomerKind> Kind { get; set; }
    }

    public class UserEntity
    {
        public string Name { get; set; }
        public CustomerKind Kind { get; set; }
    }
  • Using existing direct mapping constructor

    target.MainAddress = new AddressDTO(source.MainAddress);
    
  • using existing multi-parameter constuctor

    this.User =  new UserDTO(firstName: entity.FirstName, lastName: entity.LastName, age: entity.Age);