我定义了以下四个类
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
能够获取 SourceDataType
和 DestinationDataType
之间的映射,并将 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/