Este grupo de expertos despúes de algunos días de investigación y de recopilar de información, obtuvieron los datos necesarios, esperamos que resulte de gran utilidad para tu trabajo.
Solución:
Ya que estás mapeando desde el nombre para mostrar y no el enumeración nombre, deberá crear una función de mapeo personalizada para escanear el attributes para encontrar la enumeración con ese nombre para mostrar. Puedes usar ResolveUsing
en vez de MapFrom
para utilizar una función de asignación personalizada:
Mapper.CreateMap()
.ForMember(d => d.SchoolGrade,
op => op.ResolveUsing(o=> MapGrade(o.SchoolGrade)));
public static SchoolGradeDTO MapGrade(string grade)
//TODO: function to map a string to a SchoolGradeDTO
Puede almacenar en caché los nombres en un static diccionario para que no uses la reflexión cada vez.
Aquí se pueden encontrar algunos métodos para hacerlo.
Ampliando stanleyLa respuesta de arriba con un poco más de detalle, y modificó la clase EnumHelper de esta otra discusión para enfocarse en su situación específica, ya que esta pregunta realmente abarca dos áreas, AutoMapper y obtener correctamente el valor de Enum de un string.
Mejorando stanleyLa respuesta original de:
public static class QuestionAutoMapperConfig
public static void ConfigureAutoMapper()
Mapper.CreateMap()
.ForMember(d => d.SchoolGrade,
op => op.ResolveUsing(o => MapGrade(o.SchoolGrade)));
public static SchoolGradeDTO MapGrade(string grade)
//TODO: function to map a string to a SchoolGradeDTO
return EnumHelper.Parse(grade);
He ajustado EnumHelper del ejemplo mencionado para mostrar rápidamente una opción en la que puede modificar el método Parse para probar primero el Enum.Parse() estándar y, en su defecto, intentar hacer una comparación más detallada del tipo Enum creando un diccionario de los valores basado en el nombre del valor de enumeración o en su Display attribute texto (si se usa).
public static class EnumHelper
public static IDictionary GetValues(bool ignoreCase)
var enumValues = new Dictionary();
foreach (FieldInfo fi in typeof(T).GetFields(BindingFlags.Static
public static T Parse(string value)
T result;
try
result = (T)Enum.Parse(typeof(T), value, true);
catch (Exception)
result = ParseDisplayValues(value, true);
return result;
private static T ParseDisplayValues(string value, bool ignoreCase)
IDictionary values = GetValues(ignoreCase);
string key = null;
if (ignoreCase)
key = value.ToLower();
else
key = value;
if (values.ContainsKey(key))
return values[key];
throw new ArgumentException(value);