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。但我想你已经试过了?不,没有继承权。被接受的答案是正确的解决方案。唯一的潜在问题是,它要求您提供要从中映射的源类型。如果要映射复杂类型,则可能需要创建最终的类型/实例,甚至可能需要源代码来实现。