Permetti la mapping di tipi dinamici usando AutoMapper o simili?

Ho iniziato a utilizzare https://github.com/robconery/massive per un progetto, mi chiedo se ci sia uno strumento di mapping che permetta il supporto per il mapping di tipo statico dinamico?

Ho usato AutoMapper in precedenza, AutoMapper supporta questo?

Sono a conoscenza della funzione DynamicMap di AutoMapper, tuttavia ritengo che questa funzione sia per l’esecuzione di mappe senza prima creare la mappa. Nel mio esempio qui sotto non funziona.

dynamic curUser = users.GetSingleUser(UserID); var retUser = Mapper.DynamicMap(curUser); users.GetSingleUser(UserID); // returns a dynamic object 

AutoMapper 4.2.0 ora supporta la mapping dynamic / expando / dizionario

Con questa funzione puoi associare i tuoi oggetti expando a tipi statici:

 dynamic CurUser = _users.GetSingleUser(UserID); var config = new MapperConfiguration(cfg => { }); var mapper = config.CreateMapper(); var retUser = mapper.Map(CurUser); 

Le vecchie versioni di AutoMapper non supportano questo (Massive utilizza internamente ExpandoObject che non fornisce le proprietà che possiede) e hai ragione Mapper.DynamicMap è per il mapping senza creare la configurazione di mapping.

In realtà non è difficile scrivere te stesso un mappatore se vuoi semplicemente una mapping semplice:

 public static class DynamicToStatic { public static T ToStatic(object expando) { var entity = Activator.CreateInstance(); //ExpandoObject implements dictionary var properties = expando as IDictionary; if (properties == null) return entity; foreach (var entry in properties) { var propertyInfo = entity.GetType().GetProperty(entry.Key); if(propertyInfo!=null) propertyInfo.SetValue(entity, entry.Value, null); } return entity; } } dynamic CurUser = _users.GetSingleUser(UserID); var retUser = DynamicToStatic.ToStatic(CurUser); 

Prova Slapper.AutoMapper https://github.com/randyburden/Slapper.AutoMapper

Slapper.AutoMapper associa i dati dinamici a tipi statici

Funziona sia per la dynamic che per il Dictionary che è fantastico.

Ecco un esempio (tratto dall’URL sopra) che mostra quanto facilmente funzioni con Dictionary:

 public class Person { public int Id; public string FirstName; public string LastName; } [Test] public void CanMapMatchingFieldNamesWithEase() { // Arrange var dictionary = new Dictionary { { "Id", 1 }, { "FirstName", "Clark" }, { "LastName", "Kent" } }; // Act var person = Slapper.AutoMapper.Map( dictionary ); // Assert Assert.NotNull( person ); Assert.That( person.Id == 1 ); Assert.That( person.FirstName == "Clark" ); Assert.That( person.LastName == "Kent" ); } 

Supponendo che il framework che usi ritorni ExpandoObject puoi ottenere una sorta di mapping dynamic usando AutoMapper:

 Mapper.CreateMap() .ForAllMembers((options) => options.ResolveUsing((resolution) => { var dictionary = (IDictionary) resolution.Context.SourceValue; return dictionary[resolution.Context.MemberName]; })); ... dynamic CurUser = _users.GetSingleUser(UserID); var retUser = Mapper.Map(CurUser); 

È ansible creare qualsiasi tipo di mapping complessa utilizzando i metodi ConstructUsing .

Singolo object:

 Mapper.Map(dynamicProduct); 

Elenco:

 Mapper.Map>(dynamicListOfProducts); 

Esempio (riga 71): https://github.com/AutoMapper/AutoMapper/blob/master/src/UnitTests/DynamicMapping.cs