Почему AutoMapper не может преобразовать строку в логическое значение, если целевой класс имеет параметризованный констрC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему AutoMapper не может преобразовать строку в логическое значение, если целевой класс имеет параметризованный констр

Сообщение Anonymous »

У меня есть класс 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»