我一直在使用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的方法,它将以上述方式"短路"(即给我如果类型与我想要的目标类型相同,则返回原始对象?
你可以使用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)