c# - 访问要在 IValueResolver 中映射的目标属性名称
问题描述
我想为同一个类的多个属性重用相同的 IValueResolver,要映射的所有三个属性都通过同一个进程,所以我不想重复可能几乎相同的代码。
我想做这样的事情:
CreateMap<AlertLine, AlertLineDto>()
.ForMember(dest => dest.BusinessArea, opt => opt.MapFrom<MyResolver>())
CreateMap<AlertLine, AlertLineDto>()
.ForMember(dest => dest.Division, opt => opt.MapFrom<MyResolver>())
CreateMap<AlertLine, AlertLineDto>()
.ForMember(dest => dest.SubDivision, opt => opt.MapFrom<MyResolver>())
public class MyResolver : IValueResolver<AlertLine, AlertLineDto, string>
{
private readonly ICatalogService _catalogService;
public BusinessAreaResolver(ICatalogService catalogService)
{
_catalogService = catalogService;
}
public string Resolve(AlertLine source, AlertLineDto destination, string destMember, ResolutionContext context)
{
// How to access the destination property name to be mapped?
// BusinessArea, Division, SubDivision, and so on...
string val = string.Empty;
var variant = JsonSerializer.Deserialize<AddlInformation>(source.AddlDimension);
if (variant.BUSINESS_AREA_ID > 0)
{
var businessArea = _catalogService.GetCachedBusinessAreaById(variant.BUSINESS_AREA_ID);
val = businessArea?.Description;
}
return val;
}
}
解决方案
尝试使用IMemberValueResolver
而不是IValueResolver
如果不同成员的逻辑不同,则发送属性名称而不是实际源值。
CreateMap<AlertLine, AlertLineDto>()
.ForMember(
dest => dest.BusinessArea,
opt => opt.MapFrom<MyResolver, string>(p => "BusinessArea")))
//opt => opt.MapFrom<MyResolver, string>(source => source.BusinessArea))
.ForMember(
dest => dest.Division,
opt => opt.MapFrom<MyResolver, string>(p => "Division")))
//opt => opt.MapFrom<MyResolver, string>(source => source.Division))
.ForMember(
dest => dest.SubDivision,
opt => opt.MapFrom<MyResolver, string>(p => "SubDivision"));
//opt => opt.MapFrom<MyResolver, string>(source => source.SubDivision))
该propertyName
参数将帮助您根据参数的值识别当前调用的映射。将returnValue
被映射到适当的目标成员
public class MyResolver : IMemberValueResolver<AlertLine, AlertLineDto, string, string>
{
public string Resolve(AlertLine source, AlertLineDto destination, string propertyName, string destMember, ResolutionContext context)
{
string sourceValue = string.Empty;
string returnValue = string.Empty;
switch (propertyName)
{
case "BusinessArea":
sourceValue = source.BusinessArea;
//returnValue = Some Logic here
break;
case "Division":
sourceValue = source.Division;
//returnValue = Some Logic here
break;
case "SubDivision":
sourceValue = source.SubDivision;
//returnValue = Some Logic here
break;
default:
break;
}
return returnValue;
}
}
推荐阅读
- python - 多变量函数的优化
- blockchain - Corda Quickstart 的 Notary 节点中是否有任何功能?
- ruby-on-rails - 启动 rails 应用程序时会生成不必要的文件
- url-rewriting - 如何为 ASP 站点设置重写规则?
- c# - 将字符串解析为 IPV6 问题
- terraform - 如何在terraform中实现动态匹配?
- java - 了解 Gradle 项目依赖关系,Gradle 站点示例似乎不完整
- angular - 我的 mat-table 是按大写的单词排序的,我该如何解决这个问题?
- javascript - JavaScript Selenum:如何拦截/存根请求?
- ios - react native如何在IOS中创建新专辑?