使用Automapper映射到不同类型

时间:2014-07-31 12:57:22

标签: automapper

我的模型中有两个类:

public class Operation
{
    public string Name { get; set; }
    public Calculation Details { get; set; }
}

public class Calculation
{
    public long Value { get; set; }
    public List<decimal> Points { get; set; }
}

映射到此DTO:

public class OperationDto
{
    public string Name { get; set; }
    public CalculationDto Details { get; set; }
}

public class CalculationDto
{
    public long Value { get; set; }
}

public class CalculationDetailedDto: CalculationDto
{
    public List<decimal> Points { get; set; }
}

有时,客户可以请求有关计算的详细信息。例如,取决于命令行选项:

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<Operation, OperationDto>();
        Mapper.CreateMap<Calculation, CalculationDto>();
        Mapper.CreateMap<Calculation, CalculationDetailedDto>();

        var operation = new Operation
                        {
                            Name = "Very complicated opertion.",
                            Details =
                                new Calculation
                                {
                                    Value = 1002,
                                    Points = new List<decimal> {1.2m, 2.4m, 3.7m}
                                }
                        };

        var operationDto = Mapper.Map<OperationDto>(operation);

        Debug.WriteLine("Operation name: '{0}' value: '{1}'", operationDto.Name, operationDto.Details.Value);

        if (args.Length > 0)
        {
            Debug.WriteLine("Details:");
            foreach (var point in ((CalculationDetailedDto) operationDto.Details).Points)
            {
                Debug.WriteLine("{0}", point);
            }
        }
    }

如何在运行时告诉Automapper将计算映射到CalculationDetailedDto?

2 个答案:

答案 0 :(得分:0)

您需要创建另一个使用详细计算D的OperationDto,并创建一个从Operation到OperationDetailedDto的地图:

public class OperationDetailedDto
{
    public string Name { get; set; }
    public CalculationDetailedDto Details { get; set; }
}  


Mapper.CreateMap<Operation, OperationDetailedDto>();


if (detailed) operationDto = Mapper.Map<Operation, OperationDto>(operation);
else operationDto = Mapper.Map<Operation, OperationDetailedDto(operation);

答案 1 :(得分:0)

对于那些不合适的解决方案,建议@fiskeboss可以使用以下内容。

在检查命令行参数后,您可以将Calculation重新映射到CalculationDetailedDto。

        if (args.Length > 0)
        {
            operationDto.Details = Mapper.Map<CalculationDetailedDto>(operation.Details);
            Debug.WriteLine("Details:");
            foreach (var point in ((CalculationDetailedDto) operationDto.Details).Points)
            {
                Debug.WriteLine("{0}", point);
            }
        }