当源上的属性为false时,是否可以映射为null

本文关键字:是否 null 映射 false 属性 | 更新日期: 2023-09-27 17:59:23

我正在定义源类和目标类之间的映射:

Mapper.CreateMap<Source, Target>();

如果Source上的某个属性设置为特定值,我希望映射返回null

// If Source.IsValid = false I want the mapping to return null
Source s = new Source { IsValid = false };
Target t = Mapper.Map<Target>(s);
Assert.IsNull(t);

我如何配置AutoMapper来实现这一点?

当源上的属性为false时,是否可以映射为null

您可以这样定义映射:

Mapper.CreateMap<Source, Target>().TypeMap
  .SetCondition(r => ((Source)r.SourceValue).IsValid);

编辑

如果你想让你的映射输出一个null对象,我建议你使用两个级别的映射:第一个级别通过ConvertUsing方法接管映射行为来决定是否返回null对象,如果需要映射,它会将其推迟到内部映射引擎:

static void Main(string[] args)
{
    var innerConfigurationStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
    innerConfigurationStore.CreateMap<From, To>()
                .ForMember(to => to.DestinationName, opt => opt.MapFrom(from => from.Active ? from.Name : (string)null));
    var innerMappingEngine = new MappingEngine(innerConfigurationStore);
    Mapper.CreateMap<From, To>()
        .ConvertUsing(from => from.Active ? innerMappingEngine.Map<To>(from) : null)
        ;
    WriteMappedFrom(new From() {Active = true, Name = "ActiveFrom"});
    WriteMappedFrom(new From() {Active = false, Name = "InactiveFrom"});
}
static void WriteMappedFrom(From from)
{
    Console.WriteLine("Mapping from " + (from.Active ? "active" : "inactive") + " " + from.Name);
    var to = Mapper.Map<To>(from);
    Console.WriteLine("To -> " + (to == null ? "null" :  "not null"));
}

初始答案

在Automapper中使用条件映射非常简单,下面是一些示例代码

public class From
{
    public bool Active { get; set; }
    public string Name { get; set; }
}
public class To
{
    public string DestinationName { get; set; }
}
static void Main(string[] args)
{
    Mapper.CreateMap<From, To>()
        .ForMember(to => to.DestinationName, opt => opt.MapFrom(from => from.Active ? from.Name : (string)null));
    WriteMappedFrom(new From() {Active = true, Name = "ActiveFrom"});
    WriteMappedFrom(new From() {Active = false, Name = "InactiveFrom"});
}
static void WriteMappedFrom(From from)
{
    Console.WriteLine("Mapping from " + (from.Active ? "active" : "inactive") + " " + from.Name);
    var to = Mapper.Map<To>(from);
    Console.WriteLine("To -> " + (to.DestinationName ?? "null"));
}

automapper中还有其他条件映射,但它们似乎只适用于基于约定的映射。然而,您可以进一步查看文档以确认