【问题标题】:AutoMapper: string to nullable intAutoMapper:字符串到可为空的 int
【发布时间】:2014-08-14 14:49:19
【问题描述】:

这与我之前的一篇文章 (AutoMapper: Int to String and back again) 类似,但这次涉及到另一个方面,它带有一个可为空的 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 或解析为整数以填充可为 null 的 int。但是,我在空段上遇到了构建错误。该错误只是说明它具有 ForMember 或 MapFrom 的未知方法。

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

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

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

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

【问题讨论】:

    标签: c# wcf int automapper nullable


    【解决方案1】:

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

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

    在这里,编译器不知道您需要 Nullable&lt;int&gt; 作为评估条件运算符的结果。 null 没有类型,所以需要将其强制转换为 int?

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

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

    【讨论】:

    • 安德鲁,你是绝对正确的。我更专注于 AutoMapper 功能,忘记了转换 null 的基本步骤。谢谢!!!
    • @Hitek:没问题,有时只需要另一双眼睛:)
    猜你喜欢
    • 2016-01-22
    • 2011-11-30
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2014-05-25
    相关资源
    最近更新 更多