Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Automapper帮助映射复杂的c#对象_C#_Automapper - Fatal编程技术网

Automapper帮助映射复杂的c#对象

Automapper帮助映射复杂的c#对象,c#,automapper,C#,Automapper,我正在尝试使用Automapper从Vehicle对象映射到Motor对象 public class Range<T> { public T Min { get; set; } public T Max { get; set; } } public Enum SpeedType { [Display(Name = "-")] Unknown = 0, [Display(Name = "M")] Manual= 1, [Display(Name

我正在尝试使用
Automapper
Vehicle
对象映射到
Motor
对象

public class Range<T>
{
    public T Min { get; set; }
    public T Max { get; set; }
}

public Enum SpeedType
{
    [Display(Name = "-")] Unknown = 0,
    [Display(Name = "M")] Manual= 1,
    [Display(Name = "A")] Automatic= 2
}

public class Vehicle
{
    public Range<string> Speed { get; set; }
}

public class Motor
{
    public Range<SpeedType?> Speed { get; set; }
}
公共类范围
{
公共T Min{get;set;}
公共T Max{get;set;}
}
公共枚举类型
{
[显示(名称=“-”)未知=0,
[显示(Name=“M”)]手动=1,
[显示(Name=“A”)]自动=2
}
公车
{
公共范围速度{get;set;}
}
公共级电动机
{
公共范围速度{get;set;}
}
我曾尝试使用
MapFrom
(阅读文档),但没有成功。有人能给我指一下正确的方向吗。我甚至不确定是否可以使用
Automapper
来映射。我过去曾使用automapper进行简单映射。

这对我很有用:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<string, SpeedType?>().ConvertUsing(speed =>
    {
        switch (speed)
        {
            case "M": return SpeedType.Manual;
            case "A": return SpeedType.Automatic;
            default: return SpeedType.Unknown;
        }
    });

    cfg.CreateMap<Range<string>, Range<SpeedType?>>();
    cfg.CreateMap<Vehicle, Motor>();
});

var vehicle = new Vehicle
{
    Speed = new Range<string>
    {
        Min = "M",
        Max = "A"
    }
};

var motor = Mapper.Map<Vehicle, Motor>(vehicle);
Mapper.Initialize(cfg=>
{
cfg.CreateMap().ConvertUsing(速度=>
{
开关(速度)
{
案例“M”:返回速度类型。手动;
案例“A”:返回速度类型。自动;
默认:返回速度类型。未知;
}
});
CreateMap();
CreateMap();
});
var车辆=新车辆
{
速度=新范围
{
Min=“M”,
Max=“A”
}
};
var电机=映射器映射(车辆);

我想出了以下映射来解决我的问题。我编写了一个GetEnum自定义方法

CreateMap<Vehicle,Motor>()
.ForMember(g => g.Speed, opt => opt.MapFrom(u=> new Range<SpeedType?>
                {
                    Min = EnumHelper.GetEnum<SpeedType?>(u.Speed.Min),
                    Max = EnumHelper.GetEnum<SpeedType?>(u.Speed.Max),
                }))
CreateMap()
.ForMember(g=>g.Speed,opt=>opt.MapFrom(u=>new Range
{
Min=EnumHelper.GetEnum(u.Speed.Min),
Max=EnumHelper.GetEnum(u.Speed.Max),
}))

范围
与您设置的枚举一起使用是没有意义的。为什么是自动最大值和手动最小值,或者反过来说,在现实世界中没有一个概念是一个大于另一个。我简化了示例,假设车辆最小值为M,最大值为A,那么我想将其转换为最小值为1,最大值为2坦率地说,我不太喜欢
自动映射器。我不得不在一个项目中使用它一年多,但实际上它只适用于使简单的事情变得比必要的更复杂。一些
FromDto
ToDto
[extension]方法更简单、更快、更易于调试,并且对代码更改更具反应性。不同类布局之间的映射通常会产生与手动编写映射一样多的代码(甚至更多,有大量lambda)。另见:谢谢你的回复。了解到开关可以添加到Automapper.FYI,您基本上可以在花括号内添加任何您想要的内容。这是一个lambda表达式,因此只要所有代码路径都返回某些内容,任何代码都是有效的