Saltar al contenido

AutoMapper: ¿Cómo analizar un Int de una cadena y es posible crear reglas basadas en el tipo de datos?

Nuestros mejores programadores agotaron sus reservas de café, en su búsqueda noche y día por la resolución, hasta que Mateo encontró el resultado en GitHub así que hoy la comparte contigo.

Solución:

Terminé haciendo algo como esto:

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);

Y las clases a las que hace referencia (primer borrador):

// 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

Podría crear propiedades en su clase de origen que conviertan campos a los tipos tal como existen en el destino. Luego use AutoMapper de una manera simple y sencilla.

public class source

  public int _myfield;

  public string MyField
  
    get
    
       return _myfield.ToString();
    
  


public class destination

  public string MyField  get; set; 

Solo para mantenerme actualizado.
Las versiones más nuevas pueden hacer algunas conversiones simples automáticamente

    public class Source
    
        public string String get; set; 
    

    public class Target
    
        public int Int  get; set; 
        public decimal Decimal get; set; 
    

    [Fact]
    public void TestCustomMap()
    
        Mapper.Initialize(cfg =>
            cfg.CreateMap()
                .ForMember(dest => dest.Int, opt => opt.MapFrom(src => src.String))
                .ForMember(dest => dest.Decimal, opt => opt.MapFrom(src => src.String)));

        var target = Mapper.Instance.Map(new Source  String = "123" );
        Assert.Equal(expected: 123, actual: target.Int);
        Assert.Equal(expected: 123m, actual: target.Decimal);

        //This will throw an exception
        //Mapper.Instance.Map(new Source  String = "123.2" );
    

Si haces scroll puedes encontrar las crónicas de otros sys admins, tú de igual manera puedes dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *