Mapack for .NET is a popular open-source library used for mapping one object type to another. It simplifies the process of converting data between different object types, which is a common requirement in many .NET applications. Here’s an overview of its key features, setup, and examples:
Key Features
- Simple and Fast: Mapack is designed to be fast and easy to use. It uses a simple and intuitive API for mapping properties between objects.
- Attribute-based Configuration: You can use attributes to configure how properties are mapped, allowing for fine-grained control over the mapping process.
- Support for Complex Types and Collections: It supports mapping of complex types, including nested objects and collections.
- LINQ Support: Offers support for LINQ, making it easy to work with mapped data in queries.
Setup
To set up Mapack for .NET in your project, you typically use NuGet Package Manager. Here’s how you can install it:
- Open your .NET project in Visual Studio.
- Right-click on your project in the Solution Explorer and select “Manage NuGet Packages.”
- Search for “Mapack” and select the package.
- Click “Install” to add it to your project.
Alternatively, you can use the .NET CLI:
dotnet add package Mapack
Examples
Basic Mapping
Let’s say you have two classes, User and UserDTO, and you want to map properties from User to UserDTO.
public class User
{
public int Id { get; set; public string Name { get; set; }
public string Email { get; set; }
}
public class UserDTO
{
public int Id { get; set; }
public string Name { get; set; }
}
var user = new User { Id = 1, Name = “John Doe”, Email = “[email protected]” };
var mapper = Mapper.Map<User, UserDTO>(user);
Console.WriteLine(\("Id: </span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">mapper</span><span class="token interpolation-string interpolation expression language-csharp">.</span><span class="token interpolation-string interpolation expression language-csharp">Id</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">, Name: </span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">mapper</span><span class="token interpolation-string interpolation expression language-csharp">.</span><span class="token interpolation-string interpolation expression language-csharp">Name</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span></code></div></div></pre> <h4>Using Attributes for Custom Mapping</h4> <p>You can use attributes like <code class="qlv4I7skMF6Meluz0u8c wZ4JdaHxSAhGy1HoNVja _dJ357tkKXSh_Sup5xdW">[Map]</code> to specify how properties are mapped.</p> <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">csharp</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-csharp" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">class</span><span> </span><span class="token" style="color: rgb(43, 145, 175);">User</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token return-type" style="color: rgb(0, 0, 255);">int</span><span> Id </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">get</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">set</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">[</span><span class="token attribute" style="color: rgb(43, 145, 175);">Map</span><span class="token attribute attribute-arguments" style="color: rgb(57, 58, 52);">(</span><span class="token attribute attribute-arguments" style="color: rgb(163, 21, 21);">"FullName"</span><span class="token attribute attribute-arguments" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">]</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token return-type" style="color: rgb(0, 0, 255);">string</span><span> Name </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">get</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">set</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token return-type" style="color: rgb(0, 0, 255);">string</span><span> Email </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">get</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">set</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span> <span></span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">class</span><span> </span><span class="token" style="color: rgb(43, 145, 175);">UserDTO</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token return-type" style="color: rgb(0, 0, 255);">int</span><span> Id </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">get</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">set</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">public</span><span> </span><span class="token return-type" style="color: rgb(0, 0, 255);">string</span><span> FullName </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">get</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">set</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span> <span></span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> user </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">new</span><span> </span><span class="token constructor-invocation" style="color: rgb(43, 145, 175);">User</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> Id </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">1</span><span class="token" style="color: rgb(57, 58, 52);">,</span><span> Name </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"John Doe"</span><span class="token" style="color: rgb(57, 58, 52);">,</span><span> Email </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"[email protected]"</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span></span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> mapper </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> Mapper</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token generic-method" style="color: rgb(57, 58, 52);">Map</span><span class="token generic-method generic" style="color: rgb(57, 58, 52);"><</span><span class="token generic-method generic" style="color: rgb(43, 145, 175);">User</span><span class="token generic-method generic" style="color: rgb(57, 58, 52);">,</span><span class="token generic-method generic" style="color: rgb(43, 145, 175);"> UserDTO</span><span class="token generic-method generic" style="color: rgb(57, 58, 52);">></span><span class="token" style="color: rgb(57, 58, 52);">(</span><span>user</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span>Console</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">WriteLine</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">\)“Id: {mapper.Id}, FullName: {.FullName}”);
Mapping Collections
Mapack also supports mapping collections.
public class Order
{
public int Id { get; set; }
public string ProductName { get; set; }
}
public class OrderDTO
{
public int Id { get; set; }
public string ProductName { get; set; }
}
var orders = new List<Order>
{
new Order { Id = 1, ProductName = “Product A” },
new Order { Id = 2, ProductName = “Product B” }
};
var orderDTOs = Mapper.Map<List<Order>, List<OrderDTO>>(orders);
foreach (var orderDTO in orderDTOs)
{
Console.WriteLine($“Id: {orderDTO.Id}, ProductName: {orderDTO.ProductName}”);
}
These examples demonstrate the basic usage and capabilities of Mapack for .NET. For more advanced features and configurations, such as custom type converters and ignoring properties, refer to the official Mapack documentation.