【问题标题】:Complex collections with Automapper使用 Automapper 的复杂集合
【发布时间】:2010-09-03 14:32:34
【问题描述】:

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

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.MapSource, Dest>(src);

有人可以帮我做映射吗?提前致谢。

【问题讨论】:

  • 澄清一下:您希望 dest.name 来自 source.name 和 dest.A 来自 source.Inner.A 和 dest.B 来自 source.Inner.B?
  • Patrick,是的,这就是我所追求的行为。

标签: automapper


【解决方案1】:

这个问题已经有几个月的历史了,但如果您仍在寻找答案,这就是我尝试过的有效方法:

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 进行深入研究,所以我可能遗漏了一些东西,但它们似乎已正确映射。

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 2012-04-19
    • 2021-06-07
    • 1970-01-01
    • 2017-08-05
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多