我一直在使用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,它将以上述方式“短路”(即如果类型与我想要的目标类型相同,请给我回原始对象吗?
答案 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);
}
}