我有两个完全相同的类但在不同的命名空间(即项目)。现在我使用AutoMapper映射两个类的对象,但它给了我一个错误。错误是:
“无法将lambda表达式转换为'string'类型,因为它不是委托类型”
以下是我的代码:
Mapper.CreateMap<Namespace1.EventID, Namespace2.EventID>().ForMember(
dest => dest.EventType, src => src.EventType);
我也试过了。
Mapper.CreateMap<Namespace1.EventID, Namespace2.EventID>().ForMember(
dest => dest.EventType, map => map.MapFrom(src => src.Eventtype));
Namespace2.EventID destEventID = Mapper.Map<Namespace2.EventID>(eventID);
我在dest => dest.EventType
收到错误。
请注意,EventType
属于其他类类型。
由于这两个类具有相同的结构,因此不需要ForMember()
但如果我删除ForMember()
,则它会显示运行时异常"Missing type map configuration or unsupported mapping"
。
我已添加system.Linq
和system.Data
两者。
如何映射这两种类型?
答案 0 :(得分:2)
我得到了同样的错误。根据你发布的内容,我不知道我们的理由是否相同,但也许这有助于解释我的错误原因。
作为第一个参数,字符串有一个重载,但我们需要另一个第一个参数是函数的地方。编译器似乎没有得到。就我而言,那是因为编译器在第二个参数中有错误。一旦修复,就不再抱怨"cannot convert lambda expression to type 'string' because it is not a delegate type"
了。
以下是与我合作的内容:
public class ClassA
{
public DateTime? memberX { get; set; }
public DateTime? memberY { get; set; }
}
public class ClassB
{
public long? memberX { get; set; }
public long? memberY { get; set; }
}
DateTime IntToDateTime(int t);
int DateTimeToInt(DateTime t);
第一个(CreateMap<ClassA,ClassB>
)有效,第二个(CreateMap<ClassB,ClassA>
)无效。
CreateMap<ClassA, ClassB>()
.ForMember(dest => dest.memberX, opt => opt.MapFrom(src => src.memberX.HasValue ? DateTimeToInt(src.memberX.Value) : 0))
.ForMember(dest => dest.memberY, opt => opt.MapFrom(src => src.memberY.HasValue ? DateTimeToInt(src.memberY.Value) : 0))
;
CreateMap<ClassB, ClassA>()
.ForMember(dest => dest.memberX, opt => opt.MapFrom(src => src.memberX.HasValue ? IntToDateTime((int)src.memberX.Value) : null))
.ForMember(dest => dest.memberY, opt => opt.MapFrom(src => src.memberY.HasValue ? IntToDateTime((int)src.memberY.Value) : null))
;
第二个(CreateMap<ClassB,ClassA>
)的作用是什么:
CreateMap<ClassB, ClassA>()
.ForMember(dest => dest.memberX, opt => opt.MapFrom(src => src.memberX.HasValue ? IntToDateTime((int)src.memberX.Value) : (DateTime?)null))
.ForMember(dest => dest.memberY, opt => opt.MapFrom(src => src.memberY.HasValue ? IntToDateTime((int)src.memberY.Value) : (DateTime?)null))
;
您是否收到任何其他编译器错误?
可能的解决方案:
您的EventType
班级是同一个班级,还是一个Namespace1.SomeClass EventType
,另一个是Namespace2.SomeClass EventType
?如果是这种情况,则首先需要为这些创建地图。然后它应该没有.ForMember
。
Mapper.CreateMap<Namespace1.SomeClass, Namespace2.SomeClass>();
Mapper.CreateMap<Namespace1.EventID, Namespace2.EventID>();
这就是为什么编译器无法读取ForMember
中的第二个参数,导致混淆它应该选择的重载。
答案 1 :(得分:0)
当automapper无法为您尝试执行的特定映射找到正确的映射时,抛出"Missing type map configuration or unsupported mapping"
。
可能与您调用Mapper.CreateMap
函数的代码中的位置有关,需要在调用Mapper.Map
之前调用它。
此外,由于您有两个相同的类,请确保以正确的顺序创建地图。第一个Generic typ参数是源,第二个是目标。例如,您可能需要创建此地图:
Mapper.CreateMap<Namespace2.EventID, Namespace1.EventID>()
与此地图相对:
Mapper.CreateMap<Namespace1.EventID, Namespace2.EventID>()
如你所说,你不应该指定任何ForMember()
调用,因为这两个类具有相同的结构。