gpt4 book ai didi

c# - 使用带默认参数的构造函数的自动映射器

转载 作者:行者123 更新时间:2023-11-30 15:28:40 24 4
gpt4 key购买 nike

想知道处理这个问题的最佳方法:

public class SrcClass{
public int? Value1 {get;set;}
public int? Value2 {get;set;}
}

public class DestClass{
public DestClass(int? value1 = 1){
Value1 = value1
}

public int Value1 {get;set;}
public int Value2 {get;set;
}

Mapper.createMap<SrcClass,DestClass>()
.ConstructUsing( src => new DestClass(src.Value1));

var destObject = Mapper.Map<DestClass>(new SrcClass());

现在的问题是 destObject.Value1null 而不是 1 因为 AutoMapper 将值设置回 src 对象的值构造函数运行后。在我看来,我有两个糟糕的选择:

  1. 我可以在 createMap 方法中重复默认值。但是,如果有人在 SrcClass 的构造函数中添加或更改默认值并且未能将其添加到映射器配置中,这将在以后引入错误
  2. 我可以在 ConstructUsing 之后添加对 Value1 的忽略,但这会遇到与选项 1 相同的问题。如果有人进来并添加新值默认参数,但未能将其添加到映射器,这将是错误的来源。

我真正想做的是以某种方式告诉 Automapper 只映射在构造函数期间未传入的属性。不太确定框架是否有可能处理类似的事情。还有其他想法吗?

最佳答案

首先,为省略 参数提供默认值与在传入null 时将值设置为默认值之间存在差异>.

换句话说,

(new DestClass()).Value1; // Value1 == 1
(new DestClass(null)).Value1; // Value1 == null

默认值仅在未指定值时应用。否则,将使用您的类(class)用户提供的值(value)。

我只提到这一点是因为现在您的ConstructUsing 语句Value1 初始化为null if src.Value1null。换句话说,即使没有 AutoMapper 在目标对象上进行第二次传递,您也会遇到问题。

现在,即使您通过执行以下操作来解决该问题:

public class DestClass
{
// Now supplying `null` will result in `Value1` equaling "1"
public DestClass(int? value1)
{
Value1 = value1 ?? 1;
}

public int? Value1 {get; private set;}
public int? Value2 {get; set;}
}

AutoMapper 仍将映射到具有私有(private) setter 的属性,这意味着您仍然无法获得所需的结果。

幸运的是,有一个名为 IgnoreAllPropertiesWithAnInaccessibleSetter 的配置方法,您可以使用它来忽略私有(private) setter:

Mapper.CreateMap<SrcClass, DestClass>()
.ConstructUsing(src => new DestClass(src.Value1))
.IgnoreAllPropertiesWithAnInaccessibleSetter();

这样你会得到你想要的结果。但是,我已经对你的类(class)进行了大量修改,这个解决方案可能实际上并不适用于你。

如果这对您的应用程序有意义,您也可以只公开一个 getter 并引入一个私有(private)只读支持字段来达到类似的效果。

如果这对您不起作用,您最好的选择可能是手动忽略您在构造函数中设置的属性。

关于c# - 使用带默认参数的构造函数的自动映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com