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; }
}
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; }
}
Try to use this one:
Mapper.Initialize(cfg =>
{
cfg.ShouldMapProperty = pi => pi.PropertyType.IsPublic || pi.PropertyType.IsNotPublic;
});
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;
}
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;
}