C# 自动映射具有不同源类型的条件映射

C# 自动映射具有不同源类型的条件映射,c#,automapper,C#,Automapper,我试图从源实体的几个不同导航属性中的一个映射到DTO中的自定义类型属性,条件是其中哪个属性不为null 简化版本(已删除部分条件映射): CreateMap() .FormMember(目的=>目的订单, 选择=> { opt.MapFrom(src=>src.OrderType1!=null?src.OrderType1: src.OrderTypeA.OrderType1!=null?OrderTypeA.OrderType1: src.OrderType2!=null?src.OrderT

我试图从源实体的几个不同导航属性中的一个映射到DTO中的自定义类型属性,条件是其中哪个属性不为null

简化版本(已删除部分条件映射):

CreateMap()
.FormMember(目的=>目的订单,
选择=>
{
opt.MapFrom(src=>src.OrderType1!=null?src.OrderType1:
src.OrderTypeA.OrderType1!=null?OrderTypeA.OrderType1:
src.OrderType2!=null?src.OrderType2:null
));
它不会编译,因为OrderType2实体的类型与OrderType1不同

无法确定条件表达式的类型,因为存在 “OrderType1”和“OrderType2”之间没有隐式转换

我尝试创建一个空类型,使两个实体类型都继承自此类型,然后在条件表达式中转换为基类型。这会引发异常,因为它具有所有属性的未映射类型

假设我可以重构以在整个导航属性中使用基类,并为每个实体创建一个从基类到派生类的映射,以使其工作,但我觉得这会引入太多的更改


是否有一种使用Automapper的替代方法,或者解决问题的另一种方法-有多个条件可以返回要映射的不同源类型?

这似乎太简单了,但通过在条件中强制转换到对象来实现:

 CreateMap<MyDTO, MyEntity>()
                  .ForMember(dest => dest.Order,
                  opt =>
                  {
                  opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
                  src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
                  src.OrderType2 != null ? (object)src.OrderType2 : null
                  ));
CreateMap()
.FormMember(目的=>目的订单,
选择=>
{
opt.MapFrom(src=>src.OrderType1!=null?src.OrderType1:
src.OrderTypeA.OrderType1!=null?OrderTypeA.OrderType1:
src.OrderType2!=null?(对象)src.OrderType2:null
));

这将运行并创建所有必需的映射。

让它们实现一个接口如何?Automapper中是否有解决问题的解决方案此错误与Automapper无关谢谢,已编辑以请求Automapper中的替代解决方案,或者是解决问题的方法。接口将导致问题,因为类型具有mostly个不同的属性(通过映射解决)。话虽如此,这可能值得我进一步试验。这就是界面的想法,它只包含那些公共属性。
 CreateMap<MyDTO, MyEntity>()
                  .ForMember(dest => dest.Order,
                  opt =>
                  {
                  opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
                  src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
                  src.OrderType2 != null ? (object)src.OrderType2 : null
                  ));