【发布时间】: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