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?
.