I have two models for my form, a ViewModel going to it, and a ControlModel coming from it. The ControlModel has all the same field names and hierarchy, but all of the field
I ended up doing something like this:
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);
And the classes it references (first draft):
// 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