无法将 lambda 表达式转换为类型“IValueResolver<Entity, MyDto, object>”,因为它不是委托类型

Bas*_*sie 5 c# automapper .net-6.0

我试图在我的个人资料中定义这个简单的映射

CreateMap<CompanyClient, MyDto>() 
.ForMember(
    dto => dto.PaymentTerms,
    opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms != null
        ? companyClient.Company.PaymentTerms.Value
        : null))
Run Code Online (Sandbox Code Playgroud)

但我收到这个愚蠢的错误消息:

无法将 lambda 表达式转换为类型“IValueResolver<CompanyClient, MyDto, object>”,因为它不是委托类型

这里到底有什么问题呢?我在代码中的其他地方使用了大量三元运算符,但由于某种原因,这个可为空的SmartEnum情况存在某种问题

实体:

public sealed class CompanyClient
{
    ...
    Public PaymentTerm? PaymentTerms { get; private set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

数据到:

public sealed record MyDto
{
    ...
    Public int? PaymentTerms { get; private init; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

PaymentTerm.cs 只是一个简单的SmartEnum

请注意,当我这样编写时,它不会给出任何编译器错误:

.ForMember(
    dto => dto.PaymentTerms,
    opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms ?? null))
Run Code Online (Sandbox Code Playgroud)

或者

.ForMember(
    dto => dto.PaymentTerms,
    opt => opt.MapFrom(companyClient => companyClient.Company.PaymentTerms))
Run Code Online (Sandbox Code Playgroud)

问题是什么?

Bas*_*sie 8

我发现我们可以通过将非空结果转换为输出类型来摆脱这个愚蠢的消息。

那么在哪里

.ForMember(
    dst => dst.VisitReportFileId,
    opt => opt.MapFrom(src => src.VisitReportFile == null 
        ? null 
        : src.VisitReportFile.Id.Key));
Run Code Online (Sandbox Code Playgroud)

给了我一个

无法将 lambda 表达式转换为类型“IValueResolver<Activity, ActivityDTO, object>”,因为它不是委托类型

我可以通过将“else”结果转换为来修复它Guid?

.ForMember(
    dst => dst.VisitReportFileId,
    opt => opt.MapFrom(src => src.VisitReportFile == null 
        ? null 
        : (Guid?)src.VisitReportFile.Id.Key));
Run Code Online (Sandbox Code Playgroud)

  • 如果您将 null 转换为 (Guid?) 也有效(至少如果在我有 DateTimeOffset 的情况下为我工作?) (2认同)