MyLinker 1.2.0

dotnet add package MyLinker --version 1.2.0
                    
NuGet\Install-Package MyLinker -Version 1.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MyLinker" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MyLinker" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="MyLinker" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MyLinker --version 1.2.0
                    
#r "nuget: MyLinker, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MyLinker@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MyLinker&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=MyLinker&version=1.2.0
                    
Install as a Cake Tool

MyLinker

MyLinker es una librería ligera en C# que permite mapear las propiedades de un objeto de entrada (Entry Object) hacia un objeto de salida (Exit Object) de manera automática usando reflection.

Es una librería de enlace de dos objetos. Mapea automáticamente propiedades y resuelve diferencias de tipos inteligentemente.

Su objetivo es facilitar la conversión entre clases con propiedades similares (por ejemplo: DTOs, ViewModels, Entities, etc.) sin necesidad de escribir código repetitivo de asignación.


✨ Características

  • Mapeo automático de propiedades con el mismo nombre (case-insensitive).
  • Conversión automática entre:
    • string ↔ int
    • string ↔ bool
    • bool ↔ int
  • Control de seguridad para propiedades nulas.
  • Posibilidad de omitir propiedades específicas en el mapeo.
  • Excepciones claras y personalizadas (LinkerException).
  • El objeto de salida se modifica directamente por referencia, por lo que no es necesario reasignar el resultado.
  • Soporte para colecciones: puedes mapear listas completas de objetos de entrada a listas de salida.

📦 Instalación

Si la librería está publicada en NuGet, puedes instalarla con:

dotnet add package MyLinker

Si no, basta con incluir el proyecto o el archivo .cs en tu solución.


🚀 Uso básico

Ejemplo 1: Mapeo simple entre objetos

using MyLinker;

var userDto = new UserDTO
{
    Id = "123",
    Name = "Juan",
    IsActive = "true"
};

var user = new User();

Linker<UserDTO, User>.MapObjects(userDto, user);

// No es necesario reasignar `user = ...`, ya que se edita la referencia.
Console.WriteLine(user.Id);       // 123 (int convertido desde string)
Console.WriteLine(user.Name);     // "Juan"
Console.WriteLine(user.IsActive); // true (bool convertido desde string)

Ejemplo 2: Omitir propiedades en el mapeo

var userDto = new UserDTO
{
    Id = "123",
    Name = "Juan",
    IsActive = "true"
};

var user = new User { Name = "Pedro" };

Linker<UserDTO, User>.MapObjects(userDto, user, propertyOmit: new[] { "Name" });

Console.WriteLine(user.Name); // "Pedro" (no fue reemplazado)

Ejemplo 3: Controlar nulos

var dto = new ProductDTO
{
    Name = null,
    Price = "150"
};

var product = new Product { Name = "Default" };

// nullPropertySafety = true (valor por defecto) → no sobrescribe valores con null
Linker<ProductDTO, Product>.MapObjects(dto, product);

Console.WriteLine(product.Name);  // "Default"
Console.WriteLine(product.Price); // 150

Ejemplo 4: Mapear colecciones

var dtoList = new List<UserDTO>
{
    new UserDTO { Id = "1", Name = "Ana", IsActive = "true" },
    new UserDTO { Id = "2", Name = "Luis", IsActive = "false" }
};

var users = new List<User>();

Linker<UserDTO, User>.MapCollections(dtoList, users);

foreach (var u in users)
{
    Console.WriteLine($"{u.Id} - {u.Name} - {u.IsActive}");
}
// Salida:
// 1 - Ana - True
// 2 - Luis - False

⚙️ Firmas de los métodos principales

public static EX MapObjects(
    EN entryObject, 
    EX exitObject, 
    bool nullPropertySafety = true, 
    params string[]? propertyOmit
)

public static IEnumerable<EX> MapCollections(
    IEnumerable<EN> entryList, 
    ICollection<EX> exitList
)
  • entryObject → Objeto de entrada (fuente de datos).
  • exitObject → Objeto de salida (destino).
  • nullPropertySafety → Si es true, evita sobrescribir propiedades con valores null.
  • propertyOmit → Lista de nombres de propiedades a omitir.
  • entryList → Colección de objetos de entrada.
  • exitList → Colección de salida, que se llena con los resultados mapeados.

⚠️ Excepciones

  • ArgumentNullException → Cuando entryObject, exitObject o exitList son nulos.
  • LinkerException → Cuando ocurre un error durante el mapeo interno.

🛠️ Casos de uso comunes

  • Mapear DTOs ↔ Entidades en aplicaciones con capas separadas.
  • Convertir entre ViewModels y Models en aplicaciones MVVM.
  • Transformar resultados de APIs externas hacia modelos internos.
  • Mapear listas completas de DTOs a listas de entidades.

📐 Diagrama UML

+------------------------------+
|        Linker<EN,EX>         |
+------------------------------+
| + MapObjects(                |
|   entryObject: EN,           |
|   exitObject: EX,            |
|   nullPropertySafety: bool,  |
|   propertyOmit: string[] )   |
|   : EX                       |
|                              |
| + MapCollections(            |
|   entryList: IEnumerable<EN>,|
|   exitList: ICollection<EX>) |
|   : IEnumerable<EX>          |
+------------------------------+
| - BaseMapObjects(...) : EX   |
+------------------------------+

📜 Licencia

Este proyecto está bajo la licencia MIT. Puedes usarlo libremente en proyectos personales o comerciales.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.0 600 9/30/2025
1.1.0 671 9/30/2025 1.1.0 is deprecated because it is no longer maintained.
1.0.0 416 9/28/2025 1.0.0 is deprecated because it is no longer maintained.