score:1

Accepted answer

you can use the expression.increment rather than doing a + 1. or we can make it really generic.

something like this:

void main()
{
    var mapperconfiguraiton = 
        new mapperconfiguration(cfg => 
            cfg.createmap<widget, widgetmodel>()
               .increment(x => x.countd, src => src.count)
               .toupper(x => x.name, src=>src.name));

    var widget = new widget {count = 3, name="jimmy"};
    var mapper = mapperconfiguraiton.createmapper();

    var model = mapper.map<widgetmodel>(widget);
}

public class widget {
    public int count {get; set;}
    public string name {get;set;}
}

public class widgetmodel {
    public int count {get; set;}
    public string name {get;set;}
}

public static class mapperextensions {
    public static imappingexpression<tsource, tdestination> increment<tsource, tdestination>(this imappingexpression<tsource, tdestination> expression, 
        expression<func<tdestination, int>> destinationmember, 
        expression<func<tsource, int>> sourcemember) 
    {
        return expression.customaction(destinationmember, sourcemember, s => s + 1);
     }

    public static imappingexpression<tsource, tdestination> toupper<tsource, tdestination>(this imappingexpression<tsource, tdestination> expression, 
        expression<func<tdestination, string>> destinationmember, 
        expression<func<tsource, string>> sourcemember)
    {
        return expression.customaction(destinationmember, sourcemember, s => s.toupper());
    }


    public static imappingexpression<tsource, tdestination> customaction<tsource, tdestination, tdestinationmember, tsourcemember>(
        this imappingexpression<tsource, tdestination> expression, 
        expression<func<tdestination, tdestinationmember>> destinationmember, 
        expression<func<tsource, tsourcemember>> sourcemember, 
        expression<func<tsourcemember, tdestinationmember>> transform)
    {
       var sourcememberexpression = (memberexpression)sourcemember.body;        
       var sourceparameter = expression.parameter(typeof(tsource));

       var expr = expression.invoke(transform, 
                                expression
                                    .makememberaccess(sourceparameter, sourcememberexpression.member));

        var lambda = (expression<func<tsource,tsourcemember>>)
            expression.lambda(expr, sourceparameter);

        var newexpression = expression.formember(
             destinationmember, 
             opts => opts.mapfrom(lambda));

        return newexpression;
    }
}

output:

widget.count = 3
widget.name = "jimmy"

model.count = 4
model.name = "jimmy"

Related Query

More Query from same tag