Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以让AutoMapper有时返回相同的对象吗?_C#_Automapper - Fatal编程技术网

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

C# 我可以让AutoMapper有时返回相同的对象吗?,c#,automapper,C#,Automapper,我一直在使用AutoMapper在接口和该接口的具体实现之间进行映射。我假设,如果我传递给AutoMapper的Map方法的类型与返回类型相同,那么将返回原始对象(作为一种短路操作)。我的假设是错误的:事实上,在查看之后,我注意到该方法的文档明确指出: 执行从源对象到新目标对象的映射。源类型是从源对象推断的。(粗体强调) 我启动这个快速控制台应用程序只是为了验证: using System; using AutoMapper; namespace ConsoleApplication {

我一直在使用AutoMapper在接口和该接口的具体实现之间进行映射。我假设,如果我传递给AutoMapper的
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);
        }
}