使用 AutoMapper(v6.2.2,加上AutoMapper.Extensions.Microsoft.DependencyInjection)我想使用我现有的系统TypeConverter类将某些数据模型转换为字符串。
尽管内部MapperRegistry包含 aTypeConverterMapper应该能够自动执行此操作(无需此处所说的任何手动配置),StringMapper但当目标类型为 a 时,它永远不会因为优先而被调用string。
其他(较旧的)答案建议更改 中的映射对象MapperRegistry,但似乎已经创建了此类internal。
我可以在 AutoMapper 中更改(或删除)不同的内置映射器类的优先级吗?
作为一种解决方法,我还尝试在 myProfile中创建一个映射,尝试使用类型转换器将任何对象转换为字符串:
private class ApiTypeConverter : ITypeConverter<object, string>
{
public string Convert(object source, string destination, ResolutionContext context)
{
TypeConverter sourceTypeConverter = TypeDescriptor.GetConverter(source.GetType());
if (sourceTypeConverter.CanConvertTo(typeof(string)))
{
return (string)sourceTypeConverter.ConvertTo(source, typeof(string));
}
return default(string);
}
}
我配置为用于:
CreateMap<object, string>().ConvertUsing<ApiTypeConverter>();
但这也没有按预期工作。理想情况下,我只会对可以使用条件转换的成员执行此操作,例如:
ForAllMaps((m, e) => e.ForAllMembers(opt => opt.Condition(HasConverter))
.ConvertUsing<ApiTypeConverter>());
但是,这是不可能的(该ForAllMembers方法返回void)。
当我使用AutoMapper.Extensions.Microsoft.DependencyInjection 时,我能够使用additionalInitAction参数来更改映射器:
services.AddAutoMapper(InitAction, GetType().Assembly);
private void InitAction(IMapperConfigurationExpression configuration)
{
var mapper = configuration.Mappers.OfType<StringMapper>().First();
configuration.Mappers.Remove(mapper);
}
这导致一切按预期工作,但似乎有点黑客,因为其他地图可能依赖于StringMapper.
一只萌萌小番薯
开满天机
相关分类