Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

automapper working with attributes c#

Tags:

c#

automapper

I have two objects, I want to map them using AutoMapper Attributes, these are my target objects:

public class ClaseB
{
    public string UBLVersionID_nuevo { get; set; }

    public ClaseB_inside objetoB_inside { get; set; }
}

public class ClaseB_inside
{
    public string texto_inside { get; set; }
}

and this is my source class:

[MapsTo(typeof(ClaseB))]
public class ClaseA
{
    [MapsToProperty(typeof(ClaseB), "objetoB_inside.texto_inside")]
    public string texto { get; set; } = "texto prueba";

    [MapsToProperty(typeof(ClaseB), "UBLVersionID_nuevo")]
    public string texto2 { get; set; } = "texto 2 de prueba";
}

when I try to map I get the following error:

Error mapping types

and with this change:

[MapsTo(typeof(ClaseB))]
public class ClaseA
{
    [MapsToProperty(typeof(ClaseB_inside), "objetoB_inside.texto_inside")]
    public string texto { get; set; } = "texto prueba";

    [MapsToProperty(typeof(ClaseB), "UBLVersionID_nuevo")]
    public string texto2 { get; set; } = "texto 2 de prueba";
}

I get null in ClaseB.objetoB_inside but ClaseB.UBLVersionID_nuevo it works.

What am I doing wrong?

like image 819
Rodrigo Santamaria Avatar asked Apr 23 '26 08:04

Rodrigo Santamaria


1 Answers

I think the issue is with the way you are defining the mapping. Consider the following if you weren't using Automapper attributes and was initializing through the static API:

        Mapper.Initialize(expression =>
        {
            expression.CreateMap<ClaseA, ClaseB>()
                .ForMember(
                    from => from.objetoB_inside.texto_inside, 
                    to => to.MapFrom(a => a.texto2));
        });

This mapping would result in the following exception: Expression 'from => from.objetoB_inside.texto_inside' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead.

And I think that's the same issue with the Attributes definition.

So I would suggest implementing the following:

public class MapsToClaseB : MapsToAttribute
{
    public MapsToClaseB() : base(typeof(ClaseB)) { }

    public void ConfigureMapping(IMappingExpression<ClaseA, ClaseB> mappingExpression)
    {
        mappingExpression.AfterMap(
            (a, b) => b.objetoB_inside = new ClaseB_inside{texto_inside = a.texto});
    }
}

You just then need to decorate your class with this:

[MapsToClaseB]

like image 134
TheRock Avatar answered Apr 24 '26 20:04

TheRock



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!