3

我有以下代码一直在 Automapper v3 中工作,但不再在 v5 中工作。 更新它也适用于 v4。

CallScheduleProfile在其构造函数中将Title属性设置为将值传递true给它的类的实例。

CallScheduleProfileViewModel在其构造函数中,将属性设置为传递andTitle值的不同类的实例。true"Title"

我已经在 AutoMapper 中为所有 4 个类设置了映射,然后我调用了 Map。

结果是地图之后的Title属性CallScheduleProfileViewModel有一个布尔值trueFriendlyName为空,即使它是在其构造函数中设置的。

我相信正在发生的事情是,构造函数 onCallScheduleProfileViewModel被调用并被FriendlyName分配,但是当映射发生时,它调用构造函数Entry,然后映射UxEntry存在的任何属性并将其分配给Title属性,默认情况下FriendlyName将为 null,因为FriendlyName不存在UxEntry其值的不被复制。

我的假设可能是错误的,但无论哪种方式,我如何FriendlyName在映射中填充?

更新:我查看了有关嵌套类型的 Automapper文档,并且文档中提供的代码也存在问题。InnerDest如果我在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; }
}
4

1 回答 1

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
于 2016-08-01T11:15:15.343 回答