AutoMapper: строка в nullable int

Это похоже на предыдущий пост мой (AutoMapper: Int для строки и обратно), но на этот раз он затрагивает другой аспект с 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 или анализирует целое число для заполнения nullable int. Однако я получаю ошибку сборки на нулевом сегменте. Ошибка заключается в том, что она имеет неизвестный метод для ForMember или MapFrom.

Visual Studio подтверждает, что dest.ReportsToEmployeeId-это nullable int в коде после ReverseMap, поэтому кажется странным, что он его не примет. Если я изменю код на:

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

кажется, все в порядке. Поэтому я знаю, что это отображение null к nullable int, вызывающему проблему.

что я упустил? Есть ли лучший способ подойти к этому?

1 ответов


Я думаю, что ошибка, которую вы видите, скрывает фактический проблема в том, что компилятор не может определить, какой тип вы хотите из условного:

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

здесь, компилятор не знает, что вы хотите Nullable<int> в результате оценки условного оператора. null не имеет типа, поэтому вам нужно бросить его в int?:

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

или вы можете использовать default(int?) или new int?(), или бросить результат int.Parse к int?.