c# - 如何使用 AutoMapper 动态映射内部类型

标签 c# automapper

我定义了以下四个类

   public class Source
    {
        public object Value { get; set; }
    }

    public class Destination
    {
        public object Value { get; set; }
    }

    public class SourceDataType
    {
        //...
    }

    public class DestinationDataType
    {
        //...
    }

我按如下方式配置了 Automapper:

        AutoMapper.Mapper.CreateMap<Source, Destination>();
        AutoMapper.Mapper.CreateMap<SourceDataType, DestinationDataType>();

然后在我的代码中,我创建了一个具有 SourceDateType 值的 Source 对象,并尝试将它映射到一个 Destination 对象。

        var source = new Source { Value = new SourceDataType() };

        var destination = AutoMapper.Mapper.Map<Source, Destination>(source);

        Console.WriteLine(destination.GetType());
        Console.WriteLine(destination.Value.GetType());

目标类型符合预期。我希望 Automapper 能够获取 SourceDataTypeDestinationDataType 之间的映射,并将 SourceDataType 即时映射到DestinationDataType 即时。但是,目标对象被赋予了 SourceDataType 值。

我也试过 DynamicMap,但得到了同样的结果。

        var destination = AutoMapper.Mapper.DynamicMap<Source, Destination>(source);
        var destination = AutoMapper.Mapper.DynamicMap<Destination>(source);

有没有办法配置Automapper来动态映射内部类?

最佳答案

这是可以解决的,但如果越来越多的类型被添加到组合中,它将变得难以维护和复杂。无论如何,对于您的情况,这将起作用:

    [Test]
    public void CustomMapping()
    {
        //arrange
        Mapper.CreateMap<Source, Destination>()
            .ForMember(d=>d.Value, opt=>opt.ResolveUsing(ResolveValue));
        Mapper.CreateMap<SourceDataType, DestinationDataType>();

        var source = new Source { Value = new SourceDataType() };

        //act
        var destination = Mapper.Map<Source, Destination>(source);

        //assert
        destination.Value.Should().Be.OfType<DestinationDataType>();
    }

    private object ResolveValue(ResolutionResult result)
    {
        var source = result.Context.SourceValue as Source;

        if (result.Context.IsSourceValueNull || source == null || !(source.Value is SourceDataType))
        {
            return null;
        }
        var sourceValue = source.Value as SourceDataType;

        return result.Context.Engine.Map<DestinationDataType>(sourceValue);
    }

关于c# - 如何使用 AutoMapper 动态映射内部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490929/

相关文章:

c# - 如何为返回 IEnumerable 的方法编写测试

c# - 循环遍历 checkedListBox 项目而不选择所有项目

c# - 在不提取 C# 的情况下读取 ZIP

c# - 如何告诉 AutoMapper 使用 "pass by reference?"

asp.net-mvc - 在自定义 ViewModel 中重用验证属性

c# - linq distinct 或 group by 多个属性

c# - StructureMap 和嵌套泛型

asp.net-mvc - 我应该如何为 Unity 和 AutoMapper 实现 MVC Bootstrapper?

caSTLe-windsor - 注入(inject) AutoMapper

c# - 映射器vs构造函数