【问题标题】:Automapper custom value resolver reuse for multiple typesAutomapper 自定义值解析器重用多种类型
【发布时间】:2020-09-10 16:08:38
【问题描述】:

我有一个项目,我正在尝试使用 AutoMapper 从每个类中的多个类进行映射,有一些属性我想使用一些自定义逻辑将源值解析到目标。 我尝试使用 AutoMapper 文档中记录的自定义解析器方法。

这是我的代码:

public class CustomDateTextHandler : IValueResolver<object, object, string>
{
    public string Resolve(object source, object destination, string destMember, ResolutionContext context)
    {
        string txt = source.ToString();
        txt.Replace("AM/PM", "tt");
        txt.Replace("HH:MM", "hh:mm");
        if (txt.Contains("format"))
        {
            txt.Replace("mmm", "MMM");
        }
        return txt;
    }
}

public class SMapping : Profile
{
    public SMapping()
    {
        CreateMap<SourceForm, s_form>()
            .ForMember(dest => dest.id, opt => opt.Ignore())
            .ForMember(dest => dest.cell_text, opt => opt.MapFrom<CustomDateTextHandler>())
            .ForMember(dest => dest.fn_def, opt => opt.MapFrom<CustomCodeTextResolver>());
    }

我想要得到的是在解析器方法中用我的替换逻辑处理的 cell_text 值,但我面临的问题是传递给解析器的是整个 SMapping 实例,我希望能够在属性名称不同的不同类中重用解析器代码,但是看看目前发生的情况,我无法真正在不同的类中使用解析器代码。

有人可以帮我吗?

提前谢谢你。

【问题讨论】:

标签: c# automapper


【解决方案1】:

使用 IMemberValueResolver 而不是 IValueResolver。
与 IValueResolver 相比,它的 Resolve 函数多了一个参数:value。
使用 IMemberValueResolver 注册映射需要您传递 1 个额外参数 - 不是直接传递“值”,而是从给定源对象生成“值”的 lambda。

public class CustomDateTextHandler :
    IMemberValueResolver< // note: different interface
        object, object,
        string, string   // note: 1 more parameter
    >
{
    public string Resolve(
        object source, object destination,
        string sourceValue, string destMember, // note: 1 more parameter
        ResolutionContext context
    )
    {
        // here, see the difference:
        // source - source object, whole
        // sourceMember - value produced by extra lambda passed in mapping
    }
}

public class SMapping : Profile
{
    public SMapping()
    {
        CreateMap<SourceForm, s_form>()
            ...
            .ForMember(
                dest => dest.cell_text,
                opt => opt.MapFrom<CustomDateTextHandler, string>(source => source.PROPERTY11)) // note: this produces that sourceValue
            
            .ForMember(
                dest => dest.fn_def,
                opt => opt.MapFrom<CustomCodeTextResolver, string>(source => source.PROPERTY22)); // note: this produces that sourceValue
            
    }

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2014-03-27
    • 2019-11-21
    • 1970-01-01
    • 2014-04-10
    • 2020-10-04
    • 2017-07-04
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多