使用Automapper的复杂集合

时间:2010-09-03 14:32:34

标签: automapper

以下是我希望有人可以帮助我们的地方:

class Source
{  
    string name { get; set; }
    Inner { get; set; }
}

class Inner
{
    Col A { get; set; }
    Col B { get; set; }
}


class Col : IList<ClassX>, IEnunmerable<ClassX>

我需要将类Source映射到具有以下内容的目标类型:

class Dest  
{  
    string name { get; set; }  
    IList<ClassY> A { get; set;}  
    IList<ClassY> B { get; set;}  
}  

现在,ClassX和类ClassY共享相同的属性。 ClassY类具有ClassX基元属性的子集,其名称和类型完全相同。

尝试各种映射。只有ClassXClassY地图,包含集合,没有和没有任何映射,在SourceDest

之间找不到映射或缺少配置

AutoMapper.Mapper.Map&lt; SourceDest&gt;(src);

有人可以帮我解决这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

这个问题已经有几个月了,但是如果你还在寻找答案,那么这就是我尝试过的方法:

class Source
{
    public string Name { get; set; }
    public Inner Inner { get; set; }
}
class Inner
{
    public Col A { get; set; }
    public Col B { get; set; }
}
class Col : List<ClassX> { }
class ClassX
{
    public int Index { get; set; }
    public string Name { get; set; }

    public ClassX() : this(0, "") { }
    public ClassX(int index, string name)
    {
        this.Index = index;
        this.Name = name;
    }
}
class ClassY
{
    public int Index { get; set; }
    public string Name { get; set; }

    public ClassY() : this(0, "") { }
    public ClassY(int index, string name)
    {
        this.Index = index;
        this.Name = name;
    }
}
class Dest
{
    public string Name { get; set; }
    public List<ClassY> A { get; set; }
    public List<ClassY> B { get; set; }
}

[TestMethod]
public void ComplexTest()
{
    Mapper.CreateMap<Source, Dest>()
        .ForMember(dest => dest.A, config => config.MapFrom(src => src.Inner.A))
        .ForMember(dest => dest.B, config => config.MapFrom(src => src.Inner.B));
    Mapper.CreateMap<ClassX, ClassY>();

    Source source = new Source
        {
            Name = "Source",
            Inner = new Inner
                {
                    A = new Col
                        {
                            new ClassX(1, "First"),
                            new ClassX(2, "Second"),
                            new ClassX(3, "Third"),
                            new ClassX(4, "Fourth"),
                        },
                    B = new Col
                        {
                            new ClassX(5, "Fifth"),
                            new ClassX(6, "Sixth"),
                            new ClassX(7, "Seventh"),
                            new ClassX(8, "Eighth"),
                        },
                }
        };

    Dest destination = Mapper.Map<Source, Dest>(source);

    Assert.AreEqual(source.Name, destination.Name);
    Assert.AreEqual(source.Inner.A.Count, destination.A.Count);
    Assert.AreEqual(source.Inner.B.Count, destination.B.Count);
    Assert.AreEqual(source.Inner.A[0].Name, destination.A[0].Name);
    Assert.AreEqual(source.Inner.B[0].Name, destination.B[0].Name);
}

我没有深入了解我的Asserts,所以可能会有一些我错过的东西,但它们似乎被正确映射。