È possibile assegnare proprietà a setter privati utilizzando AutoMapper?Proprietà mappatura AutoMapper con private setter
risposta
Se si imposta il valore di questa proprietà nel costruttore come questo
public class RestrictedName
{
public RestrictedName(string name)
{
Name = name;
}
public string Name { get; private set; }
}
public class OpenName
{
public string Name { get; set; }
}
quindi è possibile utilizzare ConstructUsing come questo
Mapper.CreateMap<OpenName, RestrictedName>()
.ConstructUsing(s => new RestrictedName(s.Name));
che funziona con questo codice
var openName = new OpenName {Name = "a"};
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName);
Assert.AreEqual(openName.Name, restrictedName.Name);
Questo non sembra essere richiesto con l'ultima versione. Sono in grado di mappare classi con privati setter. Deve usare la riflessione internamente. – Monstieur
@Locutus Forse potresti trasformare quel commento in una risposta? Probabilmente dovrebbe essere contrassegnato come la nuova risposta a questa domanda. – julealgon
AutoMapper consente ora (non sono sicuro, da quando) di mappare le proprietà con i setter privati. Sta usando la riflessione per creare oggetti.
classi Esempio:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}
public class PersonDto
{
public string Fullname { get; private set; }
}
e mappatura:
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 mapperà proprietà con setter privata senza alcun problema. Se si desidera forzare l'incapsulamento, è necessario utilizzare IgnoreAllPropertiesWithAnInaccessibleSetter. Con questa opzione, tutte le proprietà private (e altre inaccessibili) saranno ignorate.
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname))
.IgnoreAllPropertiesWithAnInaccessibleSetter();
Il problema emergerà, se si utilizzerà Silverlight. Secondo 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.
Vedi #600 Private/internal destination properties.
Soluzione:
public class PrivateInternalProfile {
protected override Configure() {
ShouldMapField = fieldInfo => true;
ShouldMapProperty = propertyInfo => true;
CreateMap<User, UserDto>(); //etc
}
}
- 1. ASP.NET MVC - Mappatura con Automapper
- 2. Automapper - Ignora mappatura con condizione
- 3. automapper - mappatura livello profondo
- 4. Automapper: mappatura bidirezionale con ReverseMap() e ForMember()
- 5. Eccezione mappatura personalizzata automapper
- 6. Mappatura generica AutoMapper
- 7. Private getter e public setter per una proprietà Kotlin
- 8. Automapper complessa mappatura
- 9. AutoMapper: mappatura di raccolte secondarie
- 10. Automapper dovrebbe funzionare con i setter privati OOB?
- 11. forzare ottenere/impostare l'accesso di variabili private per proprietà private
- 12. "Private" attribuire proprietà in Python
- 13. Ottenere un'eccezione con AutoMapper
- 14. proprietà Moq con setter protetto
- 15. Mappatura di raccolte di libri in sola lettura con AutoMapper
- 16. Mappatura delle proprietà calcolate con JPA
- 17. Perché si usano variabili private con C# getter/setter?
- 18. Proprietà con setter privata rispetto a get-only-proprietà
- 19. La proprietà di mappatura di Automapper in modo imprevisto dal nome della proprietà parziale corrisponde a
- 20. proprietà di test con setter privati
- 21. Setter vuoto contro nessun setter nelle proprietà
- 22. Avvolgere il setter della proprietà
- 23. Python proprietà decorare setter con la lista
- 24. Automapper: utilizzare insieme origine e destinazione nella mappatura
- 25. Elasticsearch Elimina proprietà mappatura
- 26. automapper: Collection per singola stringa Proprietà
- 27. Automapper: come mappare i parametri del costruttore anziché i setter di proprietà
- 28. setter omesso vs setter privato?
- 29. Mappa di Automapper può eseguire la mappatura da un dizionario di proprietà a una destinazione piatta?
- 30. Ignora una proprietà in AutoMapper?
Quale versione di Automapper stai usando? Hai provato a farlo? – PatrickSteele
@blockhead in realtà è una questione molto importante, gli oggetti immutabili sono una pratica architettonica molto migliore degli oggetti che possono essere cambiati a piacimento (esponendo pubblicamente i loro setter). Questa è la ragione esatta per cui Entity Framework ha recentemente aggiunto la capacità di idratarsi in proprietà private, per consentire al modello di dominio di rimanere immutabile dopo l'idratazione iniziale. Forse non è il leozilla che ha bisogno di rispolverare la loro architettura. ;) – Marchy
Mi scusi? Le proprietà private dovrebbero essere private. Sono i dati che appartengono all'oggetto e solo l'oggetto lo sa e dovrebbe sapere di quei dati. – blockhead