AutoMapper: почему не обнаружено это исключение - PullRequest
1 голос
/ 14 сентября 2010

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

По сути, приведенный ниже код генерирует исключение keynotfoundexceptionкогда "dictionaryKey" содержит значение, не найденное в словаре.Что касается Automapper, то словарь содержится в исходном сопоставляемом объекте, а запрашиваемые словарные ключи получены из свойств целевого объекта (для сопоставления):

public dynamic GetValue(string dictionaryKey)
{
   return _dictionary[dictionaryKey].Value;
}

Класс расширения Autopper:как показано ниже, я добавил комментарии к строке, которая вызывает вызов кода, приведенного выше, с исключением.Проблема в том, что он не улавливается окружающим кодом, а выбрасывается до вызова Mapper.Map <...> (...).Что вызывает эту проблему, почему исключение не перехватывается в блоке try catch (я добавил точки останова для подтверждения, что исключение выдается в GetValue (...) кодом в блоке try / catch.

public static IMappingExpression<ActiveRecord, TDestination> ConvertFromDictionary<TDestination>(this IMappingExpression<ActiveRecord, TDestination> exp, Func<string, string> propertyNameMapper)
{
   foreach (
      PropertyInfo pi in typeof (TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
   {
      if (!pi.CanWrite)
         continue;

      string propertyName = pi.Name;
      propertyName = propertyNameMapper(propertyName);

      try
      {
         // The following code will fail when the target read/write property does not exist in the 
         // source dictionary.  This is thrown in GetValue as a KeyNotFoundException.  But it is not
         // caught in this try/catch.  It makes it's way all the way up to the calling code
         // i.e. var entity = Mapper.Map<ActiveRecord, EntityDetail>(activeRecord);
         exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r.ActiveFields.GetValue(propertyName)));
      }
      catch (Exception ex)
      {
         // This is never reached by the exception above
         throw ex;
      }
   }
   return exp;
}

ОБНОВЛЕНИЕ Хотя в вызове GetValue выбрасывается «исключение ключа не найдено», оно помещается в исключение AutoMapper.AutoMappingException, которое отображается в следующей строке:

Customercustomer = Mapper.Map (record);

Конечно, вызов Mapper.Map для этих объектов приведет к тому, что моя реализация IMappingExpression выполнит сопоставление в том виде, как оно было установлено:

Mapper.CreateMap (). ConvertFromDictionary (propName => propName);

Поскольку Automapper является статическим классом-оберткой для внутренней работы automapper, это является причиной того, что исключение не перехватывается при реализации IMappingExpression, а всплываетдо кода, который вызвал сам вызов карты?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Это выстрел в темноте, но возможно ли, что выбрасываемое «Исключение» на самом деле не происходит из Исключения?Обратите внимание на ответ на вопрос « Почему UnhandledExceptionEventArgs.ExceptionObject является объектом, а не исключением? »:

Это не может быть напечатано в Exception, потому что можно бросать объекты.Сеть, которая не является производной от System.Exception.Это невозможно в C # или VB.Net, но возможно в других языках на основе CLR.Следовательно, API должен поддерживать эту возможность и использовать объект типа.

Так что, хотя он никогда не должен быть нулевым, на самом деле он не может быть System.Exception.

См. Раздел спецификации CLI.10,5 (в частности, правило 40 CLS) для более подробной информации

0 голосов
/ 26 сентября 2010

чувак, это может быть глупым вопросом, но почему бы вам не сделать так, чтобы в вашем словаре был ключ «Ключ»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...