AutoMapper: come analizzare un Int da una stringa e ansible creare regole basate sul tipo di dati?

Ho due modelli per il mio modulo, un ViewModel che lo segue e un ControlModel che ne deriva. ControlModel ha tutti gli stessi nomi di campo e gerarchia, ma tutti i campi sono un tipo di dati stringa.

Come codificherai AutoMapper per convertire un campo stringa in intero? Ho provato Int32.Parse (myString) ma Int32 non è disponibile all’interno dell’espressione (dà un errore).

Mapper.CreateMap() .ForMember(dest => dest.myInteger, opt => opt.MapFrom(src => src.myString)); 

I tipi nella class e i loro corrispondenti tipi di conversione:

stringa su int, int ?, double, double?, DateTime e bool

Inoltre, esiste un modo per generalizzare i mapping in modo che tutti gli interi del target vengano analizzati con quella funzione? In altre parole, esiste un modo per creare associazioni per i tipi di dati?

MODIFICARE:

Questo sembra promettente:

 AutoMapper.Mapper.CreateMap() .ConvertUsing(src => Convert.ToInt32(src)); 

EDIT: questo post è davvero utile

Ho finito per fare qualcosa del genere:

 Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap(); Mapper.Map(mySourceObject, myDestinationObject); 

E le classi a cui fa riferimento (prima bozza):

 // TODO: Boil down to two with Generics if possible #region AutoMapTypeConverters // Automap type converter definitions for // int, int?, decimal, decimal?, bool, bool?, Int64, Int64?, DateTime // Automapper string to int? private class NullIntTypeConverter : TypeConverter { protected override int? ConvertCore(string source) { if (source == null) return null; else { int result; return Int32.TryParse(source, out result) ? (int?) result : null; } } } // Automapper string to int private class IntTypeConverter : TypeConverter { protected override int ConvertCore(string source) { if (source == null) throw new MappingException("null string value cannot convert to non-nullable return type."); else return Int32.Parse(source); } } // Automapper string to decimal? private class NullDecimalTypeConverter : TypeConverter { protected override decimal? ConvertCore(string source) { if (source == null) return null; else { decimal result; return Decimal.TryParse(source, out result) ? (decimal?) result : null; } } } // Automapper string to decimal private class DecimalTypeConverter : TypeConverter { protected override decimal ConvertCore(string source) { if (source == null) throw new MappingException("null string value cannot convert to non-nullable return type."); else return Decimal.Parse(source); } } // Automapper string to bool? private class NullBooleanTypeConverter : TypeConverter { protected override bool? ConvertCore(string source) { if (source == null) return null; else { bool result; return Boolean.TryParse(source, out result) ? (bool?) result : null; } } } // Automapper string to bool private class BooleanTypeConverter : TypeConverter { protected override bool ConvertCore(string source) { if (source == null) throw new MappingException("null string value cannot convert to non-nullable return type."); else return Boolean.Parse(source); } } // Automapper string to Int64? private class NullInt64TypeConverter : TypeConverter { protected override Int64? ConvertCore(string source) { if (source == null) return null; else { Int64 result; return Int64.TryParse(source, out result) ? (Int64?)result : null; } } } // Automapper string to Int64 private class Int64TypeConverter : TypeConverter { protected override Int64 ConvertCore(string source) { if (source == null) throw new MappingException("null string value cannot convert to non-nullable return type."); else return Int64.Parse(source); } } // Automapper string to DateTime? // In our case, the datetime will be a JSON2.org datetime // Example: "/Date(1288296203190)/" private class NullDateTimeTypeConverter : TypeConverter { protected override DateTime? ConvertCore(string source) { if (source == null) return null; else { DateTime result; return DateTime.TryParse(source, out result) ? (DateTime?) result : null; } } } // Automapper string to DateTime private class DateTimeTypeConverter : TypeConverter { protected override DateTime ConvertCore(string source) { if (source == null) throw new MappingException("null string value cannot convert to non-nullable return type."); else return DateTime.Parse(source); } } #endregion 

È ansible creare proprietà nella class di origine che convertono i campi nei tipi esistenti nella destinazione. Quindi utilizzare AutoMapper in modo semplice vaniglia.

 public class source { public int _myfield; public string MyField { get { return _myfield.ToString(); } } } public class destination { public string MyField { get; set; } }