Принудительное создание исключения, когда свойство источника не сопоставлено

В 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()метод, который проверяет сопоставление всех свойств.

Другие вопросы по тегам