如何解决带有F#的AutoMapper 10.0.0-如何在不进行附加映射的情况下进行修复?
我有3种类型:
type [<CLIMutable>] status = { id : Guid; name : string }
type [<CLIMutable>] container = { id : Guid; name : string; status : status}
type [<CLIMutable>] scontainer = { id : Guid; name : string; status : string}
和下一个配置
let c =
MapperConfiguration(
fun config ->
config.CreateMap<container,scontainer>()
.ForMemberFs((fun sc -> sc.name),(fun opts -> opts.MapFrom(fun m _ -> m.status.name))) |> ignore
)
我正在尝试使用下一个代码进行映射
let con = { id = Guid.NewGuid(); name = "Template 1"; container.status = { id = Guid.NewGuid(); name = "Draft" } }
let mapper = c.CreateMapper()
let sc = mapper.Map<scontainer>(con)
但是没有调用成员映射,并且sc.status包含状态对象的字符串表示形式(id和name在一起)。
当我添加新地图时:
config.CreateMap<status,string>().ConvertUsing(fun s -> s.name) |> ignore
然后sc.status包含正确的值。
有人知道如何在没有其他映射的情况下使它工作吗?
解决方法
接下来的几行解决了我的问题:
let c =
AutoMapper.MapperConfiguration(
fun config ->
config.ShouldMapProperty <- fun _ -> false
config.ShouldMapField <- fun _ -> true
)
,
为构造函数生成的元数据在容器和容器中均为(id,名称,状态)。 为属性生成的元数据是:标识,名称,容器和容器中的状态。 为字段生成的元数据是:容器和容器中的id @,name @,status @。 如果我不禁用属性用法,则自动映射器将在构造函数参数和属性之间找到匹配项,并将属性用作解析程序,这意味着将使用构造函数解析程序。 如果禁用属性用法,则构造函数参数和字段之间将不匹配,并且将不使用构造函数。 我可能是错的,但是方法的以下几行中存在错误:private void MapDestinationCtorToSource(TypeMap typeMap,List ctorParamConfigurations) 在下一个代码中: var resolvers = new LinkedList(); var canResolve = typeMap.Profile.MapDestinationPropertyToSource(typeMap.SourceTypeDetails,destCtor.DeclaringType,parameter.GetType(),parameter.Name,resolvers,IsReverseMap); if((!canResolve && parameter.IsOptional)|| IsConfigured(parameter)) { canResolve = true; } 这是一个重现错误的测试
using AutoMapper;
using System;
using Xunit;
namespace ConstructorBug
{
public class Status
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Container
{
public Guid Id { get; set; }
public string Name { get; set; }
public Status Status { get; set; }
}
public class SContainer
{
public SContainer()
{
}
public SContainer(string id,string name,string status)
{
Id = id;
Name = name;
Status = status;
}
public string Id { get; set; }
public string Name { get; set; }
public string Status { get; set; }
}
public class ConstructorBug
{
[Fact]
public void ConstructorMapBug()
{
var mapperConfiguration = new MapperConfiguration(
config =>
{
config.CreateMap<Container,SContainer>()
.ForMember(dest => dest.Status,opts => opts.MapFrom(x => x.Status.Name));
}
);
var mapper = mapperConfiguration.CreateMapper();
var con = new Container
{
Id = Guid.NewGuid(),Name = "Container 1",Status = new Status { Id = Guid.NewGuid(),Name = "Draft" }
};
var scon = mapper.Map<SContainer>(con);
Assert.Equal(scon.Id,con.Id.ToString());
Assert.Equal(scon.Name,con.Name);
Assert.Equal(scon.Status,con.Status.Name);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。