8

在 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.XandDestination.Y属性。此外,如果我测试我的配置:

Mapper.AssertConfigurationIsValid();

然后我将不会收到任何映射异常。我想要发生的是因为没有被明确忽略AutoMapperConfigurationException而被抛出。Source.Z

我想要它,以便我必须明确忽略 Z 属性才能AssertConfiguartionIsValid无例外地运行:

Mapper.CreateMap<Source, Destination>()
      .ForSourceMember(m => m.Z, e => e.Ignore());

目前,AutoMapper不会抛出异常。如果我没有明确指定Ignore. 我怎样才能做到这一点?

4

1 回答 1

5

这是断言所有源类型属性都已映射的方法:

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();

抛出异常

“YourNamespace.Source”类型的属性“Int32 Z”未映射

如果您忽略该属性,一切都很好:

Mapper.CreateMap<Source, Destination>()
      .ForSourceMember(s => s.Z, opt => opt.Ignore());
AssertAllSourcePropertiesMapped();
于 2013-03-14T17:10:06.763 回答