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 v5升级后的属性值为空

好吧,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