Я обновил свой вопрос, поскольку понял, что мой код был причиной первоначальной проблемы.Однако при дальнейшем изучении проблемы я столкнулся с исключением, которое возникает в моем коде во время процесса отображения, но я не могу перехватить его в расширении выражения отображения.
По сути, приведенный ниже код генерирует исключение 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, а всплываетдо кода, который вызвал сам вызов карты?