我刚刚开始使用 automapper 来映射 DTO实体,它似乎工作得很好。
在某些特殊情况下,我只想映射某些属性并执行额外的检查。如果没有自动映射器,代码如下所示(使用fasterflect的PropertyExtensions):
object target;
object source;
string[] changedPropertyNames = { };
foreach (var changedPropertyName in changedPropertyNames)
{
var newValue = source.GetPropertyValue(changedPropertyName);
target.SetPropertyValue(changedPropertyName, newValue);
}
当然,如果需要类型转换,则此代码将不起作用。 Automapper 使用内置的 TypeConverters,我还创建了一些特定的 TypeConverter 实现。
现在我想知道是否可以映射各个属性并使用自动映射器的类型转换实现,如下所示
Mapper.Map(source, target, changedPropertyName);
Update
我认为更多信息是必要的:
我已经创建了一些地图,例如
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
我还为 CalendarEvent 中可为空的 dateTime 属性创建了一个带有自定义类型转换器的映射,例如
Mapper.CreateMap<DateTimeOffset?, DateTime?>().ConvertUsing<NullableDateTimeOffsetConverter>();
我在 Web API OData 控制器中使用这些地图。发布新的 EntityDTO 时,我使用
Mapper.Map(entityDto, entity);
并将实体保存到数据存储中。
但如果使用PATCH
, a Delta<TDto> entityDto
传递给我的控制器方法。因此我需要打电话entityDto.GetChangedPropertyNames()
并用更改后的值更新我现有的持久实体。
基本上,这适用于我的简单解决方案,但如果更改的属性之一是例如ADateTimeOffset
?我想用我的NullableDateTimeOffsetConverter
.