簡體   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