Сопоставьте строку с перечислением с помощью Automapper

Моя проблема заключается в гидратации Viewmodel из объекта Linq2Sql, который был возвращен из базы данных. Мы сделали это в нескольких областях, и для этого разработали хороший многоуровневый шаблон, но последний элемент требует использования некоторых перечислений, и это вызывает головную боль со всех сторон. В настоящее время мы возвращаемся из базы данных, а затем используем Automapper для гидратации (или сглаживания) в наши модели просмотра, но наличие перечислений в модели, похоже, вызывает проблемы с Automapper. Я попытался создать собственные резоверы, которых хватило бы для всех моих других требований к отображению, но в данном случае это не работает.

Пример кода выглядит так:

public class CustomerBillingTabView{
    public string PaymentMethod {get; set;}
    ...other details
}

public class BillingViewModel{
    public PaymentMethodType PaymentMethod {get; set;}
    ...other details
}

public enum PaymentMethodType {
    Invoice, DirectDebit, CreditCard, Other
}

public class PaymentMethodTypeResolver : ValueResolver<CustomerBillingTabView, PaymentMethodType>
{
    protected override PaymentMethodType ResolveCore(CustomerBillingTabView source)
    {

        if (string.IsNullOrWhiteSpace(source.PaymentMethod))
        {
            source.PaymentMethod = source.PaymentMethod.Replace(" ", "");
            return (PaymentMethodType)Enum.Parse(typeof(PaymentMethodType), source.PaymentMethod, true);
        }

        return PaymentMethodType.Other;
    }
}

        CreateMap<CustomerBillingTabView, CustomerBillingViewModel>()
        .ForMember(c => c.CollectionMethod, opt => opt.ResolveUsing<PaymentMethodTypeResolver>())

Я получаю следующую ошибку

[ArgumentException: Type provided must be an Enum.
Parameter name: enumType]
   System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult) +9626766
   System.Enum.Parse(Type enumType, String value, Boolean ignoreCase) +80
   AutoMapper.Mappers.EnumMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) +231
   AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) +720

I Я бы хотел придерживаться Automapper для всех наших действий с отображением, но я видел, как многие люди говорят, что он не выполняет сопоставления такого типа, поэтому я начинаю задаваться вопросом, не использую ли я его неправильно ? Кроме того, я видел несколько упоминаний о ValueInjecter - это альтернатива Automapper, или будет полезно просто заткнуть дырки в Automapper для гидратации моделей и использовать Automapper для выравнивания?

Да, я мог бы просто использовать строку в своей ViewModel, но я не фанат волшебных строк, и этот конкретный элемент используется помощниками для выполнения некоторой логики в ряде мест.

8
задан alex 23 April 2015 в 19:44
поделиться