AutoMapper - 使用命名约定映射复杂对象,而不提供内部映射

时间:2015-01-08 08:36:37

标签: c# automapper

我有两个具有完全相同属性的复杂对象。

现在使用AutoMapper,我通常需要执行以下操作:

Mapper.CreateMap<ObjA, ObjB>();

但是如果其中一个对象有一个复杂的内部对象,我也需要映射它:

Mapper.CreateMap<ObjAInner, ObjBInner>();

现在我有一个大的物体,一直在膨胀 每次向主对象添加复杂的内部对象时,我都不想保持CreateMap次调用。

现在我可以通过对主对象的递归反射来解决这个问题并映射所有类型,但我不想这样做。

无论如何,我可以告诉AutoMapper在复杂对象上创建一个完整的递归映射(也用于内部类型)?

这样的事情:

 Mapper.CreateFullMapOnIdenticalObjectsWithInnerTypes<ObjA, ObjB>();

编辑:

以下是一个例子:

两个具有不同命名空间的相同类:

namespace NameSpace1
{
    public class Obj1
    {
        public string Str { get; set; }
        public int Num { get; set; }
        public InnerObj1 InnerObj1 { get; set; }
    }

    public class InnerObj1
    {
        public string StrInner1 { get; set; }
        public int NumInner1 { get; set; }

        public AnotherInnerObj1 AnotherInnerObj1 { get; set; }
    }

    public class AnotherInnerObj1
    {
        public string Str { get; set; }
    }
}

namespace NameSpace2
{
    public class Obj1
    {
        public string Str { get; set; }
        public int Num { get; set; }
        public InnerObj1 InnerObj1 { get; set; }
    }

    public class InnerObj1
    {
        public string StrInner1 { get; set; }
        public int NumInner1 { get; set; }

        public AnotherInnerObj1 AnotherInnerObj1 { get; set; }
    }

    public class AnotherInnerObj1
    {
        public string Str { get; set; }
    }
}

创建模拟NameSpace1.Obj1

        public static NameSpace1.Obj1 Create()
        {
            return new NameSpace1.Obj1
            {
                Num = 10,
                Str = "Obj1",
                InnerObj1 = new NameSpace1.InnerObj1
                {
                    NumInner1 = 11,
                    StrInner1 = "InnerObj1",
                    AnotherInnerObj1 = new NameSpace1.AnotherInnerObj1
                    {
                        Str = "AnotherInnerObj1"
                    }
                }
            };
        }

这就是我想要的:

    Mapper.CreateMap<NameSpace1.Obj1, NameSpace2.Obj1>();
    var obj1 = Create();
    var obj2 = Mapper.Map<NameSpace2.Obj1>(obj1);

但是这会引发异常,因为我需要定义内部映射。这将有效:

    Mapper.CreateMap<NameSpace1.Obj1, NameSpace2.Obj1>();
    Mapper.CreateMap<NameSpace1.InnerObj1, NameSpace2.InnerObj1>();
    Mapper.CreateMap<NameSpace1.AnotherInnerObj1, NameSpace2.AnotherInnerObj1>();
    var obj1 = Create();
    var obj2 = Mapper.Map<NameSpace2.Obj1>(obj1);

0 个答案:

没有答案