有条件对象映射器上的AutoMapper属性验证



我正在使用automapper,我在下面配置的有条件映射器似乎正常工作,但是我不知道如何关闭它的验证(例如MemberList.None(在其下方的明确 CreateMap呼叫中。

public static void Configure(IMapperConfigurationExpression cfg) {
  // I want to put a MemberList.None on this
  cfg.AddConditionalObjectMapper().Where((s, d) => {
    return s == typeof(BusinessObjects.Tab) &&
    d.Namespace == "DocuSign.eSign.Model" && //is in model namespace
    d.GetMembers().FirstOrDefault(m => m.Name == "TabId") != null; //has a property TabId makes it a DocuSign Tab object
  });
  cfg.CreateMap<BusinessObjects.RequestModels.SigningEnvelope, ds.EnvelopeDefinition>(MemberList.Source);
}

暂时提出了这种粗糙的等效物。仍然想知道是否有办法使用AddConditionalObjectMapper方法实现此目的。

var tabTypes = Assembly.GetAssembly(typeof(ds.EnvelopeDefinition)).GetTypes()
  .Where(t => t.Namespace == "DocuSign.eSign.Model" && 
    t.GetMembers().Any(m => m.Name == "TabId"));
foreach (var tt in tabTypes) {
  cfg.CreateMap(typeof(BusinessObjects.Tab), tt, MemberList.None);
}

h/t向卢西安(Lucian(指向答案。

在AutoMapper配置文件类上有一个实例方法,称为ForAllMaps,该类别可让您在有条件创建的地图上迭代。因此,我创建了一个从Profile继承的新类,并能够通过下面的摘要实现我的原始目标。

public class DocuSignTabsMappingConfiguration: Profile {
  public DocuSignTabsMappingConfiguration() {
    AddConditionalObjectMapper()
      .Where((s, d) => {
        return s == typeof(BusinessObjects.Tab) &&
        d.Namespace == "DocuSign.eSign.Model" &&
        d.GetMembers().FirstOrDefault(m => m.Name == "TabId") != null;
      });
    ForAllMaps((tm, exp) => exp.ValidateMemberList(MemberList.None));
  }
}

以及在我的主要映射器配置中,将我的旧代码块替换为:

cfg.AddProfile(typeof(DocuSignTabsMappingConfiguration));      

最新更新