将 Automapper 与 Flags 枚举一起使用
Using Automapper with Flags Enum
我正在尝试弄清楚如何在以下情况下使用 AutoMapper :-
我有以下实体模型:-
public class Lender : LegacyEntity
{
public int Id { get; set; }
public string Name { get; set; }
public ClaimType ClaimTypes { get; set; }
//Other properties kepy out for brevity.
}
这是以下服务模型:-
public class LenderServiceModel
{
[Editable(false)]
public int Id { get; set; }
[Editable(false)]
public string Name { get; set; }
[Editable(false)]
public List<string> ClaimTypes { get; set; }
}
对于实体模型,ClaimType 属性 是一个标志枚举 :-
[Flags]
public enum ClaimType : int
{
A = 1,
B = 2,
C = 4,
}
我希望能够从实体模型映射到服务模型。我需要将 ClaimType 映射到服务模型上的列表,但我没有运气。
我是 AutoMapper 的新手,我们将不胜感激。
首先,您需要获取枚举标志的字符串列表表示形式,这可以通过以下语句完成
var t = Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (claimType & r) == r).Select(r => r.ToString()).ToList();
对于使用 AutoMapper 的特定映射,您需要在设置时指定它。
因此,为此将使用以下代码:因此我们使用列表转换将 ClaimTypes 字段从源映射到目标...
AutoMapper.Mapper.CreateMap<LegacyEntity, LenderServiceModel >()
.ForMember(dest => dest.ClaimTypes,
opts => opts.MapFrom(Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (src.ClaimTypes & r) == r).Select(r => r.ToString()).ToList());
您需要为 ClaimTypes 创建一个 属性 映射,它将每个标志值转换为一个字符串。有几种方法可以做到这一点。查看 this answer 以获取一些想法。
以下是在 AutoMapper 中进行设置的方法(使用一种快速而肮脏的方法,仅 ToString()
枚举然后拆分字符串):
Mapper.CreateMap<Lender, LenderServiceModel>()
.ForMember(dest => dest.ClaimTypes, opts => opts.MapFrom(src =>
src.ClaimTypes.ToString().Split(new string[]{", "}, StringSplitOptions.None).ToList()));
您可以看到一个有效的 .NETFiddle here
我正在尝试弄清楚如何在以下情况下使用 AutoMapper :-
我有以下实体模型:-
public class Lender : LegacyEntity
{
public int Id { get; set; }
public string Name { get; set; }
public ClaimType ClaimTypes { get; set; }
//Other properties kepy out for brevity.
}
这是以下服务模型:-
public class LenderServiceModel
{
[Editable(false)]
public int Id { get; set; }
[Editable(false)]
public string Name { get; set; }
[Editable(false)]
public List<string> ClaimTypes { get; set; }
}
对于实体模型,ClaimType 属性 是一个标志枚举 :-
[Flags]
public enum ClaimType : int
{
A = 1,
B = 2,
C = 4,
}
我希望能够从实体模型映射到服务模型。我需要将 ClaimType 映射到服务模型上的列表,但我没有运气。
我是 AutoMapper 的新手,我们将不胜感激。
首先,您需要获取枚举标志的字符串列表表示形式,这可以通过以下语句完成
var t = Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (claimType & r) == r).Select(r => r.ToString()).ToList();
对于使用 AutoMapper 的特定映射,您需要在设置时指定它。 因此,为此将使用以下代码:因此我们使用列表转换将 ClaimTypes 字段从源映射到目标...
AutoMapper.Mapper.CreateMap<LegacyEntity, LenderServiceModel >()
.ForMember(dest => dest.ClaimTypes,
opts => opts.MapFrom(Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (src.ClaimTypes & r) == r).Select(r => r.ToString()).ToList());
您需要为 ClaimTypes 创建一个 属性 映射,它将每个标志值转换为一个字符串。有几种方法可以做到这一点。查看 this answer 以获取一些想法。
以下是在 AutoMapper 中进行设置的方法(使用一种快速而肮脏的方法,仅 ToString()
枚举然后拆分字符串):
Mapper.CreateMap<Lender, LenderServiceModel>()
.ForMember(dest => dest.ClaimTypes, opts => opts.MapFrom(src =>
src.ClaimTypes.ToString().Split(new string[]{", "}, StringSplitOptions.None).ToList()));
您可以看到一个有效的 .NETFiddle here