Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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#_.net_Automapper - Fatal编程技术网

C# 我可以使用AutoMapper在两个不可变的字段之间进行映射吗?

C# 我可以使用AutoMapper在两个不可变的字段之间进行映射吗?,c#,.net,automapper,C#,.net,Automapper,我有以下两个类(为简洁起见,省略了许多属性) 服务层POCO: public class TicketFlag { public ContactKey ContactKey; } LINQ到SQL生成的POCO: public class TicketFlag { public string ContactKey; } 在“服务调用->数据库保存”中尝试使用AutoMapper在这两个调用之间映射时,我遇到以下异常: Exception of type 'AutoMa

我有以下两个类(为简洁起见,省略了许多属性)

服务层POCO:

public class TicketFlag
{
    public ContactKey ContactKey;
}
LINQ到SQL生成的POCO:

public class TicketFlag
{
    public string ContactKey;    
}
在“服务调用->数据库保存”中尝试使用AutoMapper在这两个调用之间映射时,我遇到以下异常:

Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
 ---> System.ArgumentException: Type 'ContactKey' does not have a default constructor
ContactKey没有专门的默认构造函数。基本上,它接受一个字符串和一个对象列表,并且可以对自身进行序列化/反序列化

我尝试过创建一个映射函数(它是相反的),如下所示:

Mapper.CreateMap().ConvertUsing(s=>ContactKeySerializer.Serialize(s));
但我仍然收到投诉,因为ContactKey没有默认构造函数


有没有办法让AutoMapper不使用默认构造函数进行属性映射?实际上,仅仅在ContactKey上映射属性是不够的——我需要让它调用构造函数,或者从我的ContactKeySerializer类中得到spit。

首先,您可能应该针对这些内容,而不是字段。然而,我怀疑这是你问题的一部分

您可以尝试将这部分映射从一个
TicketFlag
映射到另一个

Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
 .ForMember(dest => dest.ContactKey,
 mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));
Mapper.CreateMap()
.ForMember(dest=>dest.ContactKey,
mem=>mem.resolvesusing(src=>ContactKeySerializer.Serialize(src.ContactKey));

我认为这可以防止出现错误。

AutoMapper抱怨您没有默认构造函数,因为AutoMapper需要创建目标类的空实例,然后才能将值映射到它。它不能调用ContractKey的参数化构造函数-它将如何调用

在这种情况下,如果构造函数如下所示,它可能看起来很简单:

public ContracktKey(string keyValue){}
但如果它有两个参数呢

public ContracktKey(string keyValue, string otherValue){}
它怎么知道把价值放在哪里?如果您只提供了一个字符串呢


我认为最好按照其他人的建议映射这两个
TicketFlag
对象。

你确定这不是因为它们是
字段而不是
属性吗?它们是字段,谢谢你指出。现在编辑以澄清。不过,我不确定为什么这很重要。也许我需要RTFM:)?你能显示Mapper.Map调用吗,特别是你认为使用CreateMap的那个调用?它对我很有效。您是否从示例代码中删除了导致问题的内容?@Tim S有一些帮助器类缓存了我删除的映射。可能是那里有什么东西。我查一下。还将尝试您的答案(使用ResolveUsing)-以前从未使用过那个答案。我理解为什么它需要一个默认的构造函数。在这种情况下,甚至尝试调用它都没有意义(我不希望为调用者提供默认的ctor,他们真的需要使用参数化的ctor)。你说得对,我应该用对方的答案。很好的解释。
public ContracktKey(string keyValue, string otherValue){}