C# 我可以让AutoMapper有时返回相同的对象吗?
我一直在使用AutoMapper在接口和该接口的具体实现之间进行映射。我假设,如果我传递给AutoMapper的C# 我可以让AutoMapper有时返回相同的对象吗?,c#,automapper,C#,Automapper,我一直在使用AutoMapper在接口和该接口的具体实现之间进行映射。我假设,如果我传递给AutoMapper的Map方法的类型与返回类型相同,那么将返回原始对象(作为一种短路操作)。我的假设是错误的:事实上,在查看之后,我注意到该方法的文档明确指出: 执行从源对象到新目标对象的映射。源类型是从源对象推断的。(粗体强调) 我启动这个快速控制台应用程序只是为了验证: using System; using AutoMapper; namespace ConsoleApplication {
Map
方法的类型与返回类型相同,那么将返回原始对象(作为一种短路操作)。我的假设是错误的:事实上,在查看之后,我注意到该方法的文档明确指出:
执行从源对象到新目标对象的映射。源类型是从源对象推断的。(粗体强调)
我启动这个快速控制台应用程序只是为了验证:
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
}
}
}
使用系统;
使用自动制版机;
命名空间控制台应用程序
{
班级计划
{
接口IFoo
{
字符串条{get;}
}
Foo类:IFoo
{
公共字符串条{get;set;}
}
静态void Main(字符串[]参数)
{
CreateMap();
ifooa=新Foo{Bar=“baz”};
foob=Mapper.Map(a);
Console.WriteLine(Object.ReferenceEquals(a,b));//false
}
}
}
现在我知道了这种行为,我可以针对我的特定用例对其进行优化,但我想知道是否有另一种使用AutoMapper的方法,它将以上述方式“短路”(即,如果类型与我想要的目标类型相同,则返回原始对象)?您可以使用
Mapper.Map(源、目标)
重载
Foo b = new Foo();
Mapper.Map<IFoo,Foo>(a,b);
foob=newfoo();
地图(a,b);
AutoMapper将使用b,而不是构建新对象。总的来说,您可以在Mapper.Map周围使用包装器,这种替代方法可能更好(未经测试):
公共类MyMapper
{
公共静态TDestination映射(对象源),其中TDestination:class
{
if(来源为TDestination)
{
返回(TDestination)源;//此处短路
}
返回Mapper.Map(源);
}
公共静态TDestination映射(TSource-source,TDestination-destination-destination)
{
返回Mapper.Map(源、目标);
}
}
而不是typeof(TDestination).IsAssignableFrom==source.GetType()
我会做不太严格的源代码是TDestination
。您的方法对接口不起作用,==
将返回false。谢谢。我更新了示例以反映您的惊人建议。另一个建议是,如果您使用is
,您应该像第一个示例那样进行直接播放,不要像第二个示例那样使用。如果强制转换失败,as
不需要添加额外的逻辑,因为您已经知道as
将通过is
检查成功。我尝试了,但发现编译器错误。所以我使用'as'操作符。啊,我刚刚检查了什么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);
}
}