有时我可以让 AutoMapper return 同一个对象吗?

Can I get AutoMapper to return the same object sometimes?

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

Execute a mapping from the source object to a new destination object. The source type is inferred from the source object. (bold emphasis mine)

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

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 的替代方法,它将 "short-circuit" 以上述方式(即,如果类型与我想要的目标类型相同,则返回原始对象)?

您可以使用 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);
        }
}