Force throwing of exception when a source property is unmapped

后端 未结 1 884
野的像风
野的像风 2021-02-15 14:47

In AutoMapper 2.2.1, is there any way I can configure my mappings so that when a property is not explicitly ignored, an exception is thrown? For example, I have the following cl

1条回答
  •  被撕碎了的回忆
    2021-02-15 15:20

    Here is method which asserts that all source type properties are mapped:

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

    It checks all configured mappings and verifies that each source type property has mapping defined (either mapped, or ignored).

    Usage:

    Mapper.CreateMap();
    // ...
    AssertAllSourcePropertiesMapped();
    

    That throws exception

    Property 'Int32 Z' of type 'YourNamespace.Source' is not mapped

    If you will ignore that property, all is fine:

    Mapper.CreateMap()
          .ForSourceMember(s => s.Z, opt => opt.Ignore());
    AssertAllSourcePropertiesMapped();
    

    0 讨论(0)
提交回复
热议问题