AutoMapper投影中的Lambda表达式错误

时间:2014-03-04 12:17:50

标签: c# asp.net linq automapper

我有两个完全相同的类但在不同的命名空间(即项目)。现在我使用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.Linqsystem.Data两者。 如何映射这两种类型?

2 个答案:

答案 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()调用,因为这两个类具有相同的结构。