AutoMapper 11 和静态道具的问题
Issue with AutoMapper 11 and static props
我在 .NET 6 上使用 AutoMapper 11,在映射包含静态道具或静态构造函数的 classes 时遇到意外行为:
public class Source
{
public string Prop { get; set; }
}
public class Target
{
private static readonly string PREFIX = "TEST_";
// or:
//private static readonly string PREFIX;
//static Target()
//{
// PREFIX = "TEST_";
//}
public Target(string prop)
{
this.Prop = PREFIX + prop;
}
public string Prop { get; private set; }
}
AutoMapper 配置:
var config = new MapperConfiguration(
cfg => cfg.CreateMap<Source, Target>()
.ConstructUsing(s => new Target(s.Prop))
);
var mapper = config.CreateMapper();
用法:
var target = mapper.Map<Target>(source);
预期行为:
target.Prop == "TEST_VALUE"
实际行为:
target.Prop == "VALUE"
(PREFIX == null
当 Target
ctor 被执行时)
在此处查看实际问题:
https://dotnetfiddle.net/MQhcOq
Since I'm having issues adding AutoMapper on a new fiddle on dotnetfiddle, I have been forced to fork an existing fiddle with AutoMapper 10 and .NET Framework 4.7, but the same is happening with AutoMapper 11 on .NET 6.
我是不是漏了什么?
我怀疑 AutoMapper 正在反映类型并且缺少 Target
class 的静态功能,但我不知道这是否应该被视为 AutoMapper 错误或预期行为.
如果是这样,处理这种情况的“正确方法”是什么?
正如@LucianBargaoanu 在评论中所提出的,解决方案有两个:
- 确保您使用的是 AutoMapper 11+
- 移除
ConstructUsing
,让AutoMapper自动将source.Prop
映射到Target
ctor的prop
参数:
var config = new MapperConfiguration(
cfg => cfg.CreateMap<Source, Target>()
// .ConstructUsing(s => new Target(s.Prop))
);
我仍然不明白为什么 ConstructUsing
会跳过静态属性初始化以及是否会出现这种行为。
我在 .NET 6 上使用 AutoMapper 11,在映射包含静态道具或静态构造函数的 classes 时遇到意外行为:
public class Source
{
public string Prop { get; set; }
}
public class Target
{
private static readonly string PREFIX = "TEST_";
// or:
//private static readonly string PREFIX;
//static Target()
//{
// PREFIX = "TEST_";
//}
public Target(string prop)
{
this.Prop = PREFIX + prop;
}
public string Prop { get; private set; }
}
AutoMapper 配置:
var config = new MapperConfiguration(
cfg => cfg.CreateMap<Source, Target>()
.ConstructUsing(s => new Target(s.Prop))
);
var mapper = config.CreateMapper();
用法:
var target = mapper.Map<Target>(source);
预期行为:
target.Prop == "TEST_VALUE"
实际行为:
target.Prop == "VALUE"
(PREFIX == null
当 Target
ctor 被执行时)
在此处查看实际问题: https://dotnetfiddle.net/MQhcOq
Since I'm having issues adding AutoMapper on a new fiddle on dotnetfiddle, I have been forced to fork an existing fiddle with AutoMapper 10 and .NET Framework 4.7, but the same is happening with AutoMapper 11 on .NET 6.
我是不是漏了什么?
我怀疑 AutoMapper 正在反映类型并且缺少 Target
class 的静态功能,但我不知道这是否应该被视为 AutoMapper 错误或预期行为.
如果是这样,处理这种情况的“正确方法”是什么?
正如@LucianBargaoanu 在评论中所提出的,解决方案有两个:
- 确保您使用的是 AutoMapper 11+
- 移除
ConstructUsing
,让AutoMapper自动将source.Prop
映射到Target
ctor的prop
参数:var config = new MapperConfiguration( cfg => cfg.CreateMap<Source, Target>() // .ConstructUsing(s => new Target(s.Prop)) );
我仍然不明白为什么 ConstructUsing
会跳过静态属性初始化以及是否会出现这种行为。