es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede convertir la expresión lambda al tipo ‘IValueResolver‘ porque no es un tipo de delegado.

Estoy tratando de definir este mapeo simple en mi perfil.

CreateMap<companyclient, mydto="">()
    .ForMember(
        dto => dto.PaymentTerms,
        opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms != null
            ? companyClient.Company.PaymentTerms.Value
            : null))

Pero estoy obteniendo este mensaje de error estúpido:

“No se puede convertir la expresión lambda al tipo ‘IValueResolver<companyclient, mydto,=”” object=””>’ porque no es un tipo de delegado”.

¿Cuál es exactamente el problema aquí? He utilizado muchos operadores ternarios en otros lugares de mi código, pero por alguna razón este caso de SmartEnum nullable tiene algún tipo de problema.

Entidad:

public sealed class CompanyClient
{
    ...
    public PaymentTerm? PaymentTerms { get; private set; }
    ...
}

DTO:

public sealed record MyDto
{
    ...
    public int? PaymentTerms { get; private init; }
    ...
}

PaymentTerm.cs es solo un Simple SmartEnum.

Cabe destacar que no da ningún error de compilación cuando lo escribo de esta manera:

.ForMember(
    dto => dto.PaymentTerms,
    opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms ?? null))

o

.ForMember(
    dto => dto.PaymentTerms,
    opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms))

¿Cuál es el problema?</companyclient,></companyclient,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que hay un problema al convertir la expresión lambda a un tipo IValueResolver. Parece estar relacionado con el uso del operador ternario y el caso nullable SmartEnum. Sin embargo, el error desaparece al utilizar el operador de fusión null (??) o al eliminar por completo la comprobación de nulos.

    Una solución potencial podría ser crear un resolvedor de valores personalizado para el mapeo de PaymentTerms en lugar de intentar usar el operador ternario dentro del método ForMember. Esto se puede lograr creando una nueva clase que implemente la interfaz IValueResolver y luego utilizando esa clase en la configuración del mapeo en lugar de la expresión lambda.

    Otro enfoque podría ser refactorizar el código para evitar completamente el caso nullable SmartEnum, por ejemplo, usando un valor predeterminado no nulo en lugar de null.

    En cualquier caso, es posible que se necesite realizar una depuración adicional y solución de problemas para determinar la causa raíz del problema y encontrar la mejor solución para el escenario específico.

Comments are closed.