我有以下代码在Automapper的v3中工作但不再在v5中。 更新它也适用于v4。
CallScheduleProfile
在其构造函数中将Title
属性设置为类的实例,该类将值true
传递给它。
CallScheduleProfileViewModel
在其构造函数中将Title
属性设置为传递值true
和"Title"
的其他类的实例。
我已经在AutoMapper中为所有4个类设置了映射,然后我调用了Map。
结果是,在映射之后Title
CallScheduleProfileViewModel
上的true
属性的布尔值为FriendlyName
,但CallScheduleProfileViewModel
为空,即使它在其构造函数中设置也是如此。
我认为正在发生的是FriendlyName
上的构造函数被调用并且Entry
被分配但是当映射发生时它调用UxEntry
上的构造函数然后映射任何存在的Title
上的属性并将其分配给FriendlyName
属性,默认情况下FriendlyName
将为null,因为UxEntry
上的FriendlyName
不存在不会复制值。
在这个假设中我可能错了,但无论哪种方式我如何在映射中填充InnerDest
?
更新:我在嵌套类型上查看了Automapper documentation,并且文档中提供的代码也存在问题。如果我向OuterDest
添加字符串属性并在Map
构造函数中设置其值,则在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; }
}
之后其值为null。
edittext.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,
int end, Spanned dst, int dstart, int dend) {
if(src.toString().matches("[a-zA-Z ]+")){
return src;
}
return "";
}
}
});
答案 0 :(得分:0)
好吧,Automapper
将此属性映射到null
,因为:
A)类型Entry<T>
的构造方法将此属性设置为null
值
B)Automapper在(!)调用Entry<T>
中的构造函数后创建CallScheduleProfileViewModel
的新实例。
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