2016-04-08 7 views
2

У меня есть исходный объект, который является производным от System.Data.DataRow которого строка свойства отбросит исключения на Get если основное значение DBNullAutoMapper как игнорировать исключение при получении свойства, которое генерирует исключение?

private static void CreateMappings(IMapperConfiguration config) 
{ 
    config.CreateMap<SrcRow, DestDto>() 
    .ForMember(d => d.Error_Text, opt => opt.ResolveUsing(row => 
     { 
      try 
      { 
       // the getter of this string property throws exception if internal value is DBNull 
       return row.error_text; 
      } 
      catch 
      { 
       return null; 
      } 
     })) 
    ; 

}

Все свойства источника и назначения строки. Исходный объект является оберткой вокруг DataRow, и каждое свойство получает определенное значение строки. Если значением строки является значение DBNull, свойство getter генерирует исключение. Как я могу достичь этого кода, но для всех членов типа назначения вместо копирования/вставки этого кода для каждого члена?

+1

Не используйте исключения в качестве потока управления. Вы можете легко преобразовать его в условный возврат. –

+0

Даже если я попытаюсь: var x = row.error_text; он все равно бросит. Я должен поймать. Это не поле, которое я могу проверить с помощью: if (row.error_text == null) – Vince

+0

Свойство выглядит примерно так: public string error_text { get {// если базовое значение DBNull, throw new Exception()} set {} } – Vince

ответ

0

Один из способов сделать это с помощью ForAllMembers() метода и создать условия для отображения значения, только если источник не сгенерирует исключение:

config.CreateMap<SrcRow, DestDto>().ForAllMembers(opts => opts.Condition(rc => 
{ 
    try { return rc.SourceValue != null; } // Or anything, just try to get the value. 
    catch { return false; } 
})); 
0

Я считаю, что Automapper обеспечивает это:

private static void CreateMappings(IMapperConfiguration config) 
{ 
    config.CreateMap<SrcRow, DestDto>() 
    .ForAllMembers(opt => opt.ResolveUsing(
    ... 
); // or use opt.Condition() 
} 
Смежные вопросы