Hit*_*tek 6 c# int wcf nullable automapper
这类似于我以前的帖子(AutoMapper:Int to String再回来),但这次涉及另一个方面,可以使用nullable int.
我的业务对象
public class Employee
{
....
public int? ReportsToEmployeeId {get; set;}
....
}
Run Code Online (Sandbox Code Playgroud)
我的WCF
[DataContract(Name="Employee", Namespace="url")]
public class Employee
{
....
[DataMember(Order = 1)]
public string ReportsToEmployeeId {get; set;}
....
}
Run Code Online (Sandbox Code Playgroud)
映射器
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)))
Run Code Online (Sandbox Code Playgroud)
我使用第一个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)))
....
Run Code Online (Sandbox Code Playgroud)
它似乎建立好.所以我知道它是null到可空int的映射导致问题.
我错过了什么?有没有更好的方法来解决这个问题?
我认为你看到的错误是隐藏了实际的问题,即编译器无法确定你想要的条件类型:
string.IsNullOrWhiteSpace(src.ReportsToEmployeeId) ?
null :
int.Parse(src.ReportsToEmployeeId)
Run Code Online (Sandbox Code Playgroud)
在这里,编译器不知道你想要一个Nullable<int>评估条件运算符的结果.null没有类型,所以你需要把它投射到int?:
string.IsNullOrWhiteSpace(src.ReportsToEmployeeId) ?
(int?)null :
int.Parse(src.ReportsToEmployeeId)
Run Code Online (Sandbox Code Playgroud)
或者您可以使用default(int?),或者new int?()将结果int.Parse转换为int?.
| 归档时间: |
|
| 查看次数: |
2154 次 |
| 最近记录: |