Принудительное создание исключения, когда свойство источника не сопоставлено
В AutoMapper 2.2.1 есть ли способ настроить сопоставления так, чтобы, когда свойство явно не игнорировалось, генерировалось исключение? Например, у меня есть следующие классы и конфигурации:
public class Source
{
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
}
public class Destination
{
public int X { get; set; }
public int Y { get; set; }
}
// Config
Mapper.CreateMap<Source, Destination>();
Я получаю с этой конфигурацией то, что Destination.X
а также Destination.Y
свойства установлены. Кроме того, если я проверю свою конфигурацию:
Mapper.AssertConfigurationIsValid();
Тогда я не получу никаких картографических исключений. То, что я хотел бы случиться, - то, что AutoMapperConfigurationException
брошен потому что Source.Z
явно не игнорируется.
Я хотел бы, чтобы я явно игнорировал свойство Z для AssertConfiguartionIsValid
бежать без исключений:
Mapper.CreateMap<Source, Destination>()
.ForSourceMember(m => m.Z, e => e.Ignore());
В настоящее время AutoMapper не выдает исключение. Я хотел бы, чтобы это выдало исключение, если я не укажу явно Ignore
, Как я могу это сделать?
2 ответа
Вот метод, который утверждает, что все свойства типа источника сопоставлены:
public static void AssertAllSourcePropertiesMapped()
{
foreach (var map in Mapper.GetAllTypeMaps())
{
// Here is hack, because source member mappings are not exposed
Type t = typeof(TypeMap);
var configs = t.GetField("_sourceMemberConfigs", BindingFlags.Instance | BindingFlags.NonPublic);
var mappedSourceProperties = ((IEnumerable<SourceMemberConfig>)configs.GetValue(map)).Select(m => m.SourceMember);
var mappedProperties = map.GetPropertyMaps().Select(m => m.SourceMember)
.Concat(mappedSourceProperties);
var properties = map.SourceType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var propertyInfo in properties)
{
if (!mappedProperties.Contains(propertyInfo))
throw new Exception(String.Format("Property '{0}' of type '{1}' is not mapped",
propertyInfo, map.SourceType));
}
}
}
Он проверяет все настроенные сопоставления и проверяет, что для каждого свойства типа источника определено сопоставление (либо сопоставлено, либо проигнорировано).
Использование:
Mapper.CreateMap<Source, Destination>();
// ...
AssertAllSourcePropertiesMapped();
Это исключение
Свойство Int32 Z типа YourNamespace.Source не отображается
Если вы игнорируете это свойство, все в порядке:
Mapper.CreateMap<Source, Destination>()
.ForSourceMember(s => s.Z, opt => opt.Ignore());
AssertAllSourcePropertiesMapped();
Более новые версии AutoMapper имеютMapperConfiguration.AssertConfigurationIsValid()
метод, который проверяет сопоставление всех свойств.