Automapper v5升级后的空属性值

时间:2016-08-01 10:19:39

标签: c# automapper automapper-5

我有以下代码在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 "";
        }
    }
});

1 个答案:

答案 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