Anonymous
Почему AutoMapper не может преобразовать строку в логическое значение, если целевой класс имеет параметризованный констр
Сообщение
Anonymous » 13 июл 2024, 23:22
У меня есть класс Destination с конструктором, который принимает параметры, и я пытаюсь сопоставить объект Source с Destination с помощью AutoMapper. Сопоставление для Id работает нормально, но сопоставление для InStore, похоже, не работает, когда я использую пользовательское сопоставление. Вот мой код:
Код: Выделить всё
using AutoMapper;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => int.Parse(src.Id)))
.ForMember(dest => dest.InStore, opt => opt.MapFrom(src => src.InStore == "1"));
});
var mapper = config.CreateMapper();
var source = new Source { Id = "123", InStore = "1" };
var destination = mapper.Map(source);
Console.WriteLine($"Id: {destination.Id}, InStore: {destination.InStore}");
public class Source
{
public string Id { get; set; }
public string InStore { get; set; }
}
public class Destination
{
public int Id { get; private set; }
public bool InStore { get; private set; }
public Destination(int id, bool inStore)
{
Id = id;
InStore = inStore;
}
}
Выдать исключение:
Код: Выделить всё
AutoMapper.AutoMapperMappingException: 'Error mapping types.'
FormatException: String '1' was not recognized as a valid Boolean.
Когда я удаляю параметризованный конструктор из пункта назначения, сопоставление работает правильно. Кроме того, когда используется var source = new Source { Id = "123", InStore = "true" };, сопоставление также работает. Эти наблюдения сбивают меня с толку относительно того, почему сопоставление не удается при наличии конструктора и когда для InStore установлено значение «1».
Дерево выражений выглядит следующим образом:
Код: Выделить всё
(Source src, Destination dest, ResolutionContext ctxt) => {
Destination typeMapDestination;
return src == default(Source) ? default(Destination) : (
typeMapDestination = dest ?? new Destination((
string resolvedValue,
resolvedValue = false || src == null ? default(string) : src.Id,
Convert.ToInt32(resolvedValue)
), (
string resolvedValue,
resolvedValue = false || src == null ? default(string) : src.InStore,
Convert.ToBoolean(resolvedValue)
)),
if (dest != null) {
try {
(
string resolvedValue,
int propertyValue,
resolvedValue = false || src == null ? default(string) : src.Id,
propertyValue = Convert.ToInt32(resolvedValue),
typeMapDestination.Id = propertyValue
)
} catch (Exception ex) {
throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap);
}
},
if (dest != null) {
try {
(
string resolvedValue,
bool propertyValue,
resolvedValue = false || src == null ? default(string) : src.InStore,
propertyValue = Convert.ToBoolean(resolvedValue),
typeMapDestination.InStore = propertyValue
)
} catch (Exception ex) {
throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap);
}
},
try {
(
string resolvedValue,
resolvedValue = try {
false || src == null ? default(string) : src.Id;
} catch (NullReferenceException) {
default(string);
} catch (ArgumentNullException) {
default(string);
},
typeMapDestination.Name = resolvedValue
)
} catch (Exception ex) {
throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap);
},
typeMapDestination
);
}
Похоже, что ForMember работает не так, как ожидалось. Как мне его изменить, чтобы добиться желаемых результатов?
Подробнее здесь:
https://stackoverflow.com/questions/787 ... lass-has-a
1720902172
Anonymous
У меня есть класс Destination с конструктором, который принимает параметры, и я пытаюсь сопоставить объект Source с Destination с помощью AutoMapper. Сопоставление для Id работает нормально, но сопоставление для InStore, похоже, не работает, когда я использую пользовательское сопоставление. Вот мой код: [code]using AutoMapper; var config = new MapperConfiguration(cfg => { cfg.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => int.Parse(src.Id))) .ForMember(dest => dest.InStore, opt => opt.MapFrom(src => src.InStore == "1")); }); var mapper = config.CreateMapper(); var source = new Source { Id = "123", InStore = "1" }; var destination = mapper.Map(source); Console.WriteLine($"Id: {destination.Id}, InStore: {destination.InStore}"); public class Source { public string Id { get; set; } public string InStore { get; set; } } public class Destination { public int Id { get; private set; } public bool InStore { get; private set; } public Destination(int id, bool inStore) { Id = id; InStore = inStore; } } [/code] Выдать исключение: [code]AutoMapper.AutoMapperMappingException: 'Error mapping types.' FormatException: String '1' was not recognized as a valid Boolean. [/code] Когда я удаляю параметризованный конструктор из пункта назначения, сопоставление работает правильно. Кроме того, когда используется var source = new Source { Id = "123", InStore = "true" };, сопоставление также работает. Эти наблюдения сбивают меня с толку относительно того, почему сопоставление не удается при наличии конструктора и когда для InStore установлено значение «1». Дерево выражений выглядит следующим образом: [code](Source src, Destination dest, ResolutionContext ctxt) => { Destination typeMapDestination; return src == default(Source) ? default(Destination) : ( typeMapDestination = dest ?? new Destination(( string resolvedValue, resolvedValue = false || src == null ? default(string) : src.Id, Convert.ToInt32(resolvedValue) ), ( string resolvedValue, resolvedValue = false || src == null ? default(string) : src.InStore, Convert.ToBoolean(resolvedValue) )), if (dest != null) { try { ( string resolvedValue, int propertyValue, resolvedValue = false || src == null ? default(string) : src.Id, propertyValue = Convert.ToInt32(resolvedValue), typeMapDestination.Id = propertyValue ) } catch (Exception ex) { throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap); } }, if (dest != null) { try { ( string resolvedValue, bool propertyValue, resolvedValue = false || src == null ? default(string) : src.InStore, propertyValue = Convert.ToBoolean(resolvedValue), typeMapDestination.InStore = propertyValue ) } catch (Exception ex) { throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap); } }, try { ( string resolvedValue, resolvedValue = try { false || src == null ? default(string) : src.Id; } catch (NullReferenceException) { default(string); } catch (ArgumentNullException) { default(string); }, typeMapDestination.Name = resolvedValue ) } catch (Exception ex) { throw new AutoMapperMappingException("Error mapping types.", ex, #TypePair, #TypeMap, #PropertyMap); }, typeMapDestination ); } [/code] Похоже, что ForMember работает не так, как ожидалось. Как мне его изменить, чтобы добиться желаемых результатов? Подробнее здесь: [url]https://stackoverflow.com/questions/78744687/why-cant-automapper-convert-a-string-to-a-bool-when-the-destination-class-has-a[/url]