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

Ste*_*nds 2 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Kel*_*ero 5

你可以使用Mapper.Map<TSource,TDestination>(source, destination)过载.

 Foo b = new Foo();
 Mapper.Map<IFoo,Foo>(a,b);
Run Code Online (Sandbox Code Playgroud)

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);
        }
}
Run Code Online (Sandbox Code Playgroud)