C# 如果不为空,则自动映射,否则自定义转换

C# 如果不为空,则自动映射,否则自定义转换,c#,automapper,C#,Automapper,这是我的密码: Mapper.CreateMap<Foo, Foo2>() .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src.Bar == null ? new BarViewModel() : src.Bar)) Mapper.CreateMap() .FormMember(dest=>dest.Bar,opt=>opt.MapFrom(src=>src.Bar==null?新建BarVi

这是我的密码:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src.Bar == null ? new BarViewModel() : src.Bar))
Mapper.CreateMap()
.FormMember(dest=>dest.Bar,opt=>opt.MapFrom(src=>src.Bar==null?新建BarViewModel():src.Bar))
基本上,“BarViewModel”有一个无参数的ctor,用于在类中设置属性

所以我想对AutoMapper说:

如果该值为null,则使用类的ctor。否则,请使用现有的映射

上面给出了一个C#编译器错误。我猜演员阵容也不行

那么有没有一个汽车制造商的诀窍来做到这一点

最糟糕的情况是,我可以删除该属性的映射,只需执行以下操作:

var mapped = Mapper.Map<Foo,Foo2>(src);
if (mapped.Bar == null) mapped.Bar = new BarViewModel();
var-mapped=Mapper.Map(src);
如果(mapped.Bar==null)mapped.Bar=new BarViewModel();
但这有点难看

想法?

你可以使用。以下方面应起作用:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.ResolveUsing(src => src.Bar == null ? new Bar() : Mapper.Map<Bar,Bar2>(src.Bar)))
Mapper.CreateMap()
.FormMember(dest=>dest.Bar,opt=>opt.ResolveUsing(src=>src.Bar==null?新建条():Mapper.Map(src.Bar)))

我没有发现以下编译器错误:

public class Foo
{
    public Bar Bar { get; set; }
}

public class Foo2
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public Bar()
    {
        Id = 3;
    }
}

CreateMap<Foo, Foo2>()
    .ForMember(
        dest => dest.Bar,
        opt => opt.MapFrom(src => src.Bar == null ? new Bar() : src.Bar));
公共类Foo
{
公共条{get;set;}
}
公开课2
{
公共条{get;set;}
}
公共类酒吧
{
公共int Id{get;set;}
公共酒吧()
{
Id=3;
}
}
CreateMap()
福门博先生(
目的地=>目的地酒吧,
opt=>opt.MapFrom(src=>src.Bar==null?newbar():src.Bar));

…所以我想知道问题是否与您的映射无关?

现在您可以使用
.NullSubstitute()
将空值替换为Automapper中的某个自定义值,例如:

CreateMap<SMModel, VM_SMModel>()
                    .ForMember(d => d.myDate, o => o.NullSubstitute(new DateTime(2017,12,12)));
CreateMap()
.ForMember(d=>d.myDate,o=>o.NullSubstitute(新日期时间(2017,12,12));

从Automapper 8开始,
使用
解析,但内联的
Func
IValueResolver
IMemberValueResolver
是什么编译器错误,为什么您认为强制转换不起作用?出于好奇,
BarViewModel
是否继承自
Bar
?如果是的话,那么我认为一个cast可以工作,而您不需要一个ValueResolver。但我想你已经试过了?不,没有继承权。被接受的答案是正确的解决方案。唯一的潜在问题是,它要求您提供要从中映射的源类型。如果要映射复杂类型,则可能需要创建最终的类型/实例,甚至可能需要源代码来实现。