automapper private setter

Propiedades de mapeo de AutoMapper con setters privados



private (3)

¿Es posible asignar propiedades con configuradores privados utilizando AutoMapper?


AutoMapper permite ahora (no estoy seguro, desde cuándo) para mapear propiedades con configuradores privados. Está utilizando la reflexión para crear objetos.

Ejemplo de clases:

public class Person { public string Name { get; set; } public string Surname { get; set; } } public class PersonDto { public string Fullname { get; private set; } }

Y mapeo:

AutoMapper.Mapper.CreateMap<Person, PersonDto>() .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)); var p = new Person() { Name = "John", Surname = "Doe" }; var pDto = AutoMapper.Mapper.Map<PersonDto>(p);

AutoMapper mapeará la propiedad con el setter privado sin ningún problema. Si desea forzar la encapsulación, debe usar IgnoreAllPropertiesWithAnInaccessibleSetter. Con esta opción, todas las propiedades privadas (y otras inaccesibles) serán ignoradas.

AutoMapper.Mapper.CreateMap<Person, PersonDto>() .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)) .IgnoreAllPropertiesWithAnInaccessibleSetter();

El problema surgirá si usas Silverlight. Según MSDN: https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx

In Silverlight, you cannot use reflection to access private types and members.


Si establece el valor para estas propiedades en el constructor como este

public class RestrictedName { public RestrictedName(string name) { Name = name; } public string Name { get; private set; } } public class OpenName { public string Name { get; set; } }

entonces puedes usar ConstructUsing así

Mapper.CreateMap<OpenName, RestrictedName>() .ConstructUsing(s => new RestrictedName(s.Name));

que funciona con este código

var openName = new OpenName {Name = "a"}; var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName); Assert.AreEqual(openName.Name, restrictedName.Name);


Ver # 600 propiedades de destino privado / interno .

Solución:

public class PrivateInternalProfile { protected override Configure() { ShouldMapField = fieldInfo => true; ShouldMapProperty = propertyInfo => true; CreateMap<User, UserDto>(); //etc } }