繁体   English   中英

AutoMapper:string to nullable int

[英]AutoMapper: string to nullable int

这类似于我以前的帖子( AutoMapper:Int to String再回来 ),但这次涉及另一个方面,可以使用nullable 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从整数转换为字符串,并在必要时提供前导零。 第二个使用扩展来测试字符串值是null还是空白并将其赋值为null或解析为整数以填充可为空的int。 但是我在null段上遇到了构建错误。 该错误只是声明它具有ForMember或MapFrom的未知方法。

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

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

它似乎建立好。 所以我知道它是null到可空int的映射导致问题。

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

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

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

这里,编译器不知道你想要一个Nullable<int>作为评估条件运算符的结果。 null没有类型,所以你需要将它int?int?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM