无法从公共属性映射到公共虚拟属性

时间:2012-09-19 18:17:02

标签: c# .net automapper

我有一个自定义类:

public class Class1 {
    public string Id { get; set; }
    public MFileType DefaultFileType { get; set; }
}

我正试图映射到:

public class Class2 {
    public string Id { get; set; }
    public virtual FileType DefaultFileType { get; set; }
}

我知道我可以忽略ForMember()方法中的FileType。

但是可以将Class1映射到Class2以获取MFileType / FileType属性吗?

我尝试使用:

Mapper.CreateMap<Class1, Class2>()
    .ForMember(dest => dest.FileType, opt => opt.MapFrom(src => src.MFileType));

但这不起作用。 Class2文件是由代码工具生成的,所以我无法改变它。

这可能吗?

1 个答案:

答案 0 :(得分:1)

好的,MFileType是(继承)FileType的子类型。查看代码时,您的映射似乎不正确,因为您尝试在给定提供的类的情况下映射dest.DefaultFileType(而不是dest.FileType)。如果您解决了这个问题,它应该可以正常工作,如下面的演示代码所示。

请注意,您应该添加对AutoMapper库的引用,或者只需通过Nuget安装它。

class FileType
{
    public int MyProperty { get; set; }
}
class MFileType : FileType
{
    public int MyProperty2 { get; set; }
}

class Class1
{
    public string Id { get; set; }
    public MFileType DefaultFileType { get; set; }
}
class Class2
{
    public string Id { get; set; }
    public virtual FileType DefaultFileType { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        AutoMapper.Mapper.CreateMap<Class1, Class2>()
            .ForMember(dest => dest.DefaultFileType, opt => opt.MapFrom(src => src.DefaultFileType));

        var class1 = new Class1() { Id = "class1", DefaultFileType = new MFileType() { MyProperty = 1, MyProperty2 = 2 } };
        var class2 = AutoMapper.Mapper.Map<Class2>(class1);

        Console.WriteLine("class2.Id = " + class2.Id);
        // If below it says "False", it mapped correctly
        Console.WriteLine("class2.DefaultFileType == null = " + class2.DefaultFileType == null);

        Console.ReadLine();
    }
}