如何为automapper创建带有类型转换的表达式,以便为Enum创建地图

时间:2015-01-12 06:34:18

标签: c# asp.net asp.net-mvc automapper automapper-3

我有两节课:

source.Employee和destination.Employee。

我的函数目标属性名中只有两个名称,即destination.TestEnum1和source属性名,即source.TestEnum1。

我想动态创建表达式,如下所述。

 var mapExpr = Mapper.CreateMap<Soure.Employee, destination.Employee>().ForMember(destination => destination.TestEnum1, opt => opt.MapFrom(source => (destination.MyEnum2)source.TestEnum1));

表达式只是

destination => destination.TestEnum1, opt => opt.MapFrom(source => (destination.MyEnum2)source.TestEnum1)

我正在创建它以在Project()中映射Enum。To();. 正如

Mapper.CreateMap<Soure.MyEnum1, destination.MyEnum2>() 

使异常无法将MyEnum2映射到int 32。

来源员工:

namespace Soure
{
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public Department dept1 { get; set; }

        public int age { get; set; }

        public MyEnum1 TestEnum1 { get; set; }
    }

    public enum MyEnum1
    {
        red = 1,
        yellow = 2
    }
}

目标员工类:

namespace destination
{
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public int age { get; set; }
        public MyEnum2 TestEnum1 { get; set; }

        public Departments dept1 { get; set; }

    }
    public enum MyEnum2
    {
        red = 1,
        yellow = 2
    }
}

3 个答案:

答案 0 :(得分:0)

您可能会考虑使用Custom Type Converters,找到here

在这里,我为您制作了一个示例应用程序(简化了一下),其中我实现了继承自通用接口Enum1to2TypeConverter的{​​{1}}:

ITypeConverter

答案 1 :(得分:0)

由于示例中的enums共享相同的基础int类型,因此,automapper将自动处理此问题,如下所示:

    Mapper.CreateMap<Foo, Bar>()
    .ForMember(dest => dest.MyEnum2, opt => opt.MapFrom(src => src.MyEnum1))    
    ;

    var source = new Foo { MyEnum1 = MyEnum1.yellow };

    var destination = Mapper.Map<Bar>(source);

    Console.WriteLine(destination.MyEnum2);

<强> Working Fiddle

答案 2 :(得分:0)

您可以查看ConvertProjectionUsing,它是ConvertUsing for LINQ。

Mapper.CreateMap<MyEnum1, MyEnum2>().ProjectUsing(src => ???);

你应该把它放在哪里???,我不确定,它将取决于你的查询提供者。 EF可能会也可能无法进行该投影并将其转换为SQL。您可以将源转换为int:

Mapper.CreateMap<MyEnum1, MyEnum2>().ProjectUsing(src => (MyEnum2)(int)src);

但这完全取决于您的查询提供程序。