我有两节课:
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
}
}
答案 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);
但这完全取决于您的查询提供程序。