Saltar al contenido

Usando AutoMapper para mapear un string a una enumeración

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

¡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 *