gpt4 book ai didi

c# - 使用参数 AutoMapper 映射 View 模型子项

转载 作者:行者123 更新时间:2023-12-04 10:44:17 35 4
gpt4 key购买 nike

我是使用 AutoMapper 的新手,但遇到了问题

我有一个这样的模型。

public class StepUp {
public string Example {get;set;}
public string Example2 {get;set;}
public decimal? auxValue { get;set; }
}

但我有两个 ViewModels 作为目的地
public class NuevoStepUpViewModel()
{
public bool TieneAuxiliar { get; set; }
public string Example { get;set; }
public CargaDatosElectricos CargaDatosElectricos { get; set; }
}

public class CargaDatosElectricos {
public CargaDatosElectricos(bool tieneAuxiliar)
{
TieneAuxiliar = tieneAuxiliar;
}
public readonly bool TieneAuxiliar;
public string Example2 { get; set; }
}

我认为有些是这样的:
CreateMap<StepUp,NuevoStepUpViewModel()
.ForMember(x => x.TieneAuxiliar, x => x.MapFrom(c => c.auxValue.HasValue))
.ForMember(x => x.Example, x => x.MapFrom(c => c.Example))
.ForMember(x => x.CargaDatosElectricos.Example2, x => x.MapFrom(c => c.Example2))
.BeforeMap((x,y) => {
x.CargaDatosElectricos = new CargaDatosElectricos(c.auxValue.HasValue);
});

但我得到

Expression 'x => x.CargaDatosElectricos.Example2' must resolve to top-level member and not any child object's properties



我应该如何创建我的映射器配置来进行这种类型的映射?

最佳答案

您的代码有一些错误。您可以使用 AfterMap 更好地配置您的映射。范围而不是 BeforeMap提供复杂的配置。 (我不确定,但我认为)AutoMapper不会实例化类型为类的属性。因此,您必须在目标类 (VIewModel) 的构造器上执行此操作,或者在 AfterMap 上执行此操作.
TieneAuxiliar属性将不允许您设置 readonly 的值,因此,您将无法配置此属性的映射。我将其更改为公共(public)经典属性(property)。

在此处查看工作示例:

https://dotnetfiddle.net/HSyUVv

using System;
using AutoMapper;

public class Program
{
public static void Main()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<StepUp, NuevoStepUpViewModel>()
.ForMember(vm => vm.TieneAuxiliar, opt => opt.MapFrom(e => e.auxValue.HasValue))
.ForMember(vm => vm.Example, opt => opt.MapFrom(e => e.Example))
.AfterMap((e, vm) =>
{
vm.CargaDatosElectricos.Example2 = e.Example2;
});
});

var mapper = config.CreateMapper();

var stepUp = new StepUp()
{
Example = "Example 1",
Example2 = "Example 2",
auxValue = 10m
};

var viewModel = mapper.Map<StepUp, NuevoStepUpViewModel>(stepUp);

Console.WriteLine("SteUp was converted to ViewModel");
Console.WriteLine("TieneAuxiliar: {0}", viewModel.TieneAuxiliar);
Console.WriteLine("Example: {0}", viewModel.Example);
Console.WriteLine("CargaDatosElectricos.TieneAuxiliar: {0}", viewModel.CargaDatosElectricos.TieneAuxiliar);
Console.WriteLine("CargaDatosElectricos.Exemple2: {0}", viewModel.CargaDatosElectricos.Example2);

}

public class StepUp
{
public string Example { get; set; }
public string Example2 { get; set; }
public decimal? auxValue { get; set; }
}

public class NuevoStepUpViewModel
{
public bool TieneAuxiliar { get; set; }
public string Example { get;set; }
public CargaDatosElectricos CargaDatosElectricos { get; set; }

public NuevoStepUpViewModel()
{
this.CargaDatosElectricos = new CargaDatosElectricos();
}
}

public class CargaDatosElectricos
{
public CargaDatosElectricos()
{
}
public bool TieneAuxiliar { get; set; }
public string Example2 { get; set; }
}
}

关于c# - 使用参数 AutoMapper 映射 View 模型子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786896/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com