Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

BuildAdapter().AdaptToType<T>() does not include all expected properties when source is using inheritance

Abierto
#776 6 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
csharp
Área
backend

Línea de trabajo

Comienza reproduciendo la diferencia entre Adapt() y BuildAdapter().AdaptToType() usando el ejemplo de consola, especialmente AdaptToTypeWithInterface con IMyInterface y MyImplementation. Sigue el punto de entrada BuildAdapter().AdaptToType() y compara su tratamiento del tipo de origen con Adapt(); se considera terminado cuando las propiedades de implementación heredadas se copian tanto en las rutas síncrona como asíncrona.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug configuration problem waiting for info

While rewriting some code to use the async implementation of adapt using package Mapster.Async v2.0.1, I stubled upon an issue where not all expected source properties were copied to the result class.
However, the code was working as expected when I was using .Adapt<T>().

I've tracked it down to the source class being inherited from a base class and using a method where the parameter is of this base class type.
The following code can be used (e.g. in a console application) to reproduce the issue and show the difference in behavior between .Adapt<T>() and AdaptToType<T>():

using Mapster;
using Newtonsoft.Json;

namespace MapsterBug
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // sample source object
            var myImplementation = new MyImplementation
            {
                InterfaceProperty = 123,
                FirstImplementationProperty = 789,
                SecondImplementationProperty = "test"
            };

            // adapt using .Adapt<T>(): the result is as expected
            var resultAdapt = myImplementation.Adapt<MyDto>();

            Console.WriteLine("Result of myImplementation.Adapt<MyDto>():");
            Console.WriteLine(JsonConvert.SerializeObject(resultAdapt, Formatting.Indented));
            Console.WriteLine("\r\n-----------------------------------------\r\n");

            // adapt using .AdaptToType<T>(): the result is as expected
            var resultAdaptToType = myImplementation.BuildAdapter().AdaptToType<MyDto>();

            Console.WriteLine("Result of myImplementation.BuildAdapter().AdaptToType<MyDto>():");
            Console.WriteLine(JsonConvert.SerializeObject(resultAdaptToType, Formatting.Indented));
            Console.WriteLine("\r\n-----------------------------------------\r\n");

            // adapt using .Adapt<T>() inside a method where the parameter is of the interface type: the result is as expected
            var resultAdaptWithInterface = AdaptWithInterface(myImplementation);

            Console.WriteLine("Result of myImplementation.Adapt<MyDto>() in method with interface:");
            Console.WriteLine(JsonConvert.SerializeObject(resultAdaptWithInterface, Formatting.Indented));
            Console.WriteLine("\r\n-----------------------------------------\r\n");

            // adapt using .AdaptToType<T>() inside a method where the parameter is of the interface type:
            // the result only includes the interface property, but it does not include the properties of the implementation
            var resultAdaptToTypeWithInterface = AdaptToTypeWithInterface(myImplementation);

            Console.WriteLine("Result of myInterface.BuildAdapter().AdaptToType<MyDto>() in method with interface:");
            Console.WriteLine(JsonConvert.SerializeObject(resultAdaptToTypeWithInterface, Formatting.Indented));
        }

        static MyDto AdaptWithInterface(IMyInterface myInterface) => myInterface.Adapt<MyDto>();
        static MyDto AdaptToTypeWithInterface(IMyInterface myInterface) => myInterface.BuildAdapter().AdaptToType<MyDto>();
    }

    public interface IMyInterface
    {
        public int InterfaceProperty { get; set; }
    }

    public class MyImplementation : IMyInterface
    {
        public int InterfaceProperty { get; set; }
        public int FirstImplementationProperty { get; set; }
        public string SecondImplementationProperty { get; set; }
    }

    public class MyDto
    {
        public int InterfaceProperty { get; set; }
        public int FirstImplementationProperty { get; set; }
        public string SecondImplementationProperty { get; set; }
    }
}

This code is using AdaptToType<T>() to not complicate things by using an additional package (Mapster.Async), but the AdaptToTypeAsync<T>() method has the same behavior.
When running the application, the output is as follows:

Result of myImplementation.Adapt<MyDto>():
{
  "InterfaceProperty": 123,
  "FirstImplementationProperty": 789,
  "SecondImplementationProperty": "test"
}

-----------------------------------------

Result of myImplementation.BuildAdapter().AdaptToType<MyDto>():
{
  "InterfaceProperty": 123,
  "FirstImplementationProperty": 789,
  "SecondImplementationProperty": "test"
}

-----------------------------------------

Result of myImplementation.Adapt<MyDto>() in method with interface:
{
  "InterfaceProperty": 123,
  "FirstImplementationProperty": 789,
  "SecondImplementationProperty": "test"
}

-----------------------------------------

Result of myInterface.BuildAdapter().AdaptToType<MyDto>() in method with interface:
{
  "InterfaceProperty": 123,
  **"FirstImplementationProperty": 0,**
  **"SecondImplementationProperty": null**
}

Results 1, 2 and 3 are as expected, but the last result only includes the IMyInterface property (InterfaceProperty) and not the additional MyImplementation properties (FirstImplementationProperty and SecondImplementationProperty) marked in bold.

Versions used in code sample:

  • .NET 8
  • Mapster 7.4.0
  • Newtonsoft.Json 13.0.3
Lenguaje dominante
C#
Estrellas
5.2k
Forks
411
Merge medio
1 d 8 h
PR fusionados (30 d)
4

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de MapsterMapper/Mapster

Todos los issues de MapsterMapper/Mapster

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.