0

How to map public property Source.Name to private property Destination.Name using Automapper.

public class Source
{
    public string Name { get; set; }
}


public class Destination
{
    private string Name { get; set; }
}
MaciejLisCK
  • 3,706
  • 5
  • 32
  • 39

3 Answers3

1

Try to use this one:

Mapper.Initialize(cfg =>
          {
            cfg.ShouldMapProperty = pi => pi.PropertyType.IsPublic || pi.PropertyType.IsNotPublic;
        });
malonowa
  • 11
  • 2
0

This solution creates fake lambda expression. In this example it creates (Destination) => Destination.Name lambda.

Mapper.CreateMap<Source, Destination>()
    .ForMember(CreateMemberLambda<Destination>("Name"), mo => mo.MapFrom(sm => sm.Name));

var source = new Source() { Name = "foo" };
var destination = Mapper.Map<Destination>(source);

public Expression<Func<T, object>> CreateMemberLambda<T>(string parameterName)
{
    var type = typeof(T);
    var bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

    var parameter = type.GetProperty(parameterName, bindFlags);
    var classExpression = Expression.Parameter(type, type.Name);
    var memberAccessExpression = Expression.MakeMemberAccess(classExpression, parameter);

    var lambda = Expression.Lambda<Func<T, object>>(memberAccessExpression, classExpression);

    return lambda;
}
MaciejLisCK
  • 3,706
  • 5
  • 32
  • 39
0

I know that this post is quite old but I've found out with the same problem and modifying a little the CreateMemberLambda method that MaciejLisCK exposes worked for me.

public Expression<Func<T, object>> CreateMemberLambda<T>(string parameterName)
    {
        var type = typeof(T);
        var bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField;

        var parameter = type.GetField(parameterName, bindFlags);
        var classExpression = Expression.Parameter(type, type.Name);
        var memberAccessExpression = Expression.MakeMemberAccess(classExpression, parameter);

        var lambda = Expression.Lambda<Func<T, object>>(memberAccessExpression, classExpression);

        return lambda;
    }
Marc
  • 1