我有时可以让AutoMapper返回相同的对象吗?

时间:2015-04-17 16:06:05

标签: c# automapper

我一直在使用AutoMapper在接口和该接口的具体实现之间进行映射。我假设如果我传入AutoMapper的Map<TDestination>方法的类型与返回类型相同,那么将返回原始对象(作为一种短路操作)。我的假设是错误的:事实上,在看了之后我注意到该方法的文档明确指出:

  

执行从源对象到目标对象的映射。源类型是从源对象推断出来的。 (大胆强调我的)

我敲了这个快速控制台应用程序只是为了验证:

using System;
using AutoMapper;

namespace ConsoleApplication
{
    class Program
    {
        interface IFoo
        {
            string Bar { get; }
        }

        class Foo : IFoo
        {
            public string Bar { get; set; }
        }

        static void Main(string[] args)
        {
            Mapper.CreateMap<IFoo, Foo>();
            IFoo a = new Foo { Bar = "baz" };
            Foo b = Mapper.Map<Foo>(a);
            Console.WriteLine(Object.ReferenceEquals(a, b));  // false
        }
    }
}

既然我知道这种行为,我可以针对我的特定用例优化它,但我想知道是否有另一种方法使用AutoMapper,它将以上述方式“短路”(即如果类型与我想要的目标类型相同,请给我回原始对象吗?

1 个答案:

答案 0 :(得分:5)

您可以使用Mapper.Map<TSource,TDestination>(source, destination)重载。

 Foo b = new Foo();
 Mapper.Map<IFoo,Foo>(a,b);

AutoMapper将使用b而不是构建新对象。总的来说,您可以使用Mapper.Map周围的包装器,这种替代方式可以更好(未经测试):

public class MyMapper
{

        public static TDestination Map<TDestination>(object source) where TDestination : class
        {
            if(source is TDestination)
            {
                return (TDestination) source; //short-circuit here
            }

            return Mapper.Map<TDestination>(source);
        }


        public static TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
        {
            return Mapper.Map<TSource, TDestination>(source, destination);
        }
}