AutoMapper:将字符串转换为可空的int

本文关键字:int 转换 字符串 AutoMapper | 更新日期: 2023-09-27 18:18:05

这与我之前的一篇文章(AutoMapper: Int到String再返回)类似,但这次涉及到可空Int的另一个方面。

我的业务对象

public class Employee 
{
    ....
    public int? ReportsToEmployeeId {get; set;}
    ....
}
我WCF

[DataContract(Name="Employee", Namespace="url")]
public class Employee
{
    ....
    [DataMember(Order = 1)]
    public string ReportsToEmployeeId {get; set;}
    ....
}

映射器

Mapper.CreateMap<Employee.Entity.Employee, Employee.Service.Entity.Employee>()
    ....
    .ForMember(dest => dest.ReportsToEmployeeId, 
        opt => opt.MapFrom(src => src.ReportsToEmployeeId.HasValue ?
            src.ReportsToEmployeeId.Value.ToString("D9") :
            string.Empty))
    ....
    .ReverseMap() 
    ....
    .ForMember(dest => dest.ReportsToEmployeeId, 
        opt => opt.MapFrom(src => string.IsNullOrWhitespace(src.ReportsToEmployeeId) ? 
          null : 
          int.Parse(src.ReportsToEmployeeId)))

我使用第一个opt.MapFrom将整数转换为字符串,并在必要时提供前导零。第二个程序使用扩展来测试字符串值是空还是空,并将其赋给一个空值或解析为一个整数来填充可为空的int。然而,我得到一个构建错误上的空段。这个错误只是说明它有一个未知的ForMember或MapFrom方法。

Visual Studio确实确认dest.ReportsToEmployeeId在代码中是一个可空的整型,所以看起来很奇怪,它不会接受它。如果我将代码改为:

....
.ForMember(dest => dest.ReportsToEmployeeId, 
        opt => opt.MapFrom(src => string.IsNullOrWhitespace(src.ReportsToEmployeeId) ? 
          int.Parse(src.ReportsToEmployeeId) : 
          int.Parse(src.ReportsToEmployeeId)))
....

似乎可以构建。所以我知道是null到可空int的映射导致了这个问题。

我错过了什么?有没有更好的方法来解决这个问题?

AutoMapper:将字符串转换为可空的int

我认为你看到的错误是隐藏了实际问题,这是编译器无法确定你想要什么类型的条件:

string.IsNullOrWhiteSpace(src.ReportsToEmployeeId) ?
    null :
    int.Parse(src.ReportsToEmployeeId)

在这里,编译器不知道您想要一个Nullable<int>作为计算条件运算符的结果。null没有类型,所以需要将其强制转换为int?:

string.IsNullOrWhiteSpace(src.ReportsToEmployeeId) ?
    (int?)null :
    int.Parse(src.ReportsToEmployeeId)

或者您可以使用default(int?),或new int?(),或将int.Parse的结果强制转换为int?