访问在IValueResolver中映射的目标属性名称

3
我希望能够为同一类的多个属性重复使用相同的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;
        }

    }

1
尝试使用IMemberValueResolver代替IValueResolver自定义提供给解析器的源值 - Akshay G
1个回答

3

尝试使用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))
< p > 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;
    }    
}

非常顺利地完成了,感谢您的帮助! - pedrommuller
如何在ForAllMembers中执行相同的操作,我想传递参数名称。 - yogendra maarisetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接