Automapper v5升级后的属性值为空
本文关键字:属性 v5 Automapper | 更新日期: 2023-09-27 17:59:24
我有下面的代码,它一直在Automapper的v3中工作,但在v5中不再工作UPDATE它也适用于v4。
CallScheduleProfile
在其构造函数中将Title
属性设置为向其传递值true
的类的实例
CallScheduleProfileViewModel
在其构造函数中将Title
属性设置为传递值true
和"Title"
的不同类的实例。
我已经在AutoMapper中为所有4个类设置了映射,然后我调用Map。
结果是,在映射之后,CallScheduleProfileViewModel
上的Title
属性具有布尔值true
,但FriendlyName
是空的,即使它是在其构造函数中设置的。
我认为正在发生的是,CallScheduleProfileViewModel
上的构造函数正在被调用,FriendlyName
正在被分配,但当映射发生时,它会调用Entry
上的构造函数,然后映射UxEntry
上存在的任何属性,并将其分配给Title
属性,默认情况下,FriendlyName
将为空,并且由于UxEntry
上不存在FriendlyName
,因此其值不会被复制。
我的假设可能是错误的,但不管怎样,我如何在映射中填充FriendlyName
?
更新:我查看了Automapper关于嵌套类型的文档,文档中提供的代码也存在问题。如果我向InnerDest
添加一个字符串属性,并在OuterDest
构造函数中设置它的值,那么在Map
之后,它的值为null。
public static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<UxEntry<bool>, Entry<bool>>();
cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>();
});
var old = new CallScheduleProfile();
var newmodel = Mapper.Map<CallScheduleProfile, CallScheduleProfileViewModel>(old);
Console.WriteLine(newmodel.Title.Value);
Console.WriteLine(newmodel.Title.FriendlyName);
}
public class UxEntry<T>
{
public static implicit operator T(UxEntry<T> o)
{
return o.Value;
}
public UxEntry()
{
this.Value = default(T);
}
public UxEntry(T value)
{
this.Value = value;
}
public T Value { get; set; }
}
public class CallScheduleProfile
{
public CallScheduleProfile()
{
this.Title = new UxEntry<bool>(true);
}
public UxEntry<bool> Title { get; set; }
}
public class Entry<T>
{
public Entry()
{
}
public Entry(T value, string friendlyName)
{
this.Value = value;
this.FriendlyName = friendlyName;
}
public T Value { get; set; }
public string FriendlyName { get; set; }
public static implicit operator T(Entry<T> o)
{
return o.Value;
}
}
public class CallScheduleProfileViewModel
{
public CallScheduleProfileViewModel()
{
this.Title = new Entry<bool>(true, "Title");
}
public Entry<bool> Title { get; set; }
}
好吧,Automapper
将此属性映射到null
,因为:
A) 类型Entry<T>
的构造函数将此属性设置为null
值
B) Automapper在调用CallScheduleProfileViewModel
中的构造函数(!)之后创建Entry<T>
的新实例。
C) 没有为Automapper 设置其他规则
您可以在这里更改配置,这样您就可以让Automapper知道应该有一个默认值用于其中一个属性:
Mapper.Initialize(cfg =>
{
// when UxEntry is mapped to Entry value "Title" is used for property FriendlyName
cfg.CreateMap<UxEntry<bool>, Entry<bool>>()
.ForMember(dest => dest.FriendlyName, opt => opt.UseValue("Title"));
cfg.CreateMap<CallScheduleProfile, CallScheduleProfileViewModel>();
});
现在我们可以从CallScheduleProfileViewModel
中的构造函数中删除多余的属性初始化。
在没有其他更改的情况下运行代码会产生以下输出:
true
Title