Универсальный Конвертер Enum для AutoMapper - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующая строка в конвертер enum:

    public static T ParseString<T>(string stringValue) where T : struct
    {
        if (!string.IsNullOrWhiteSpace(stringValue))
        {
            stringValue = stringValue.Replace(" ", "_");
            T result;

            if (Enum.TryParse<T>(stringValue, out result))
            {
                return result;
            }
        }

        return default(T);
    }

, которую я использую в нескольких конвертерах автоматов:

public sealed class StringToGuaranteeTypeConverter : ITypeConverter<string, GuaranteeType>
{
    public GuaranteeType Convert(string source, GuaranteeType destination, ResolutionContext context)
    {
        return EnumExtensions.ParseString<GuaranteeType>(source);
    }
}

public sealed class StringToWhyChooseTypeConverter : ITypeConverter<string, WhyChooseType>
{
    public WhyChooseType Convert(string source, WhyChooseType destination, ResolutionContext context)
    {
        return EnumExtensions.ParseString<WhyChooseType>(source);
    }
}

Есть ли способ создать общий enumконвертер для автомаппера вместо того, чтобы создавать одно и то же для каждого перечисления, которое мне нужно конвертировать?

Я надеялся на что-то вроде:

public sealed class StringToEnumConverter : ITypeConverter<string, T> // this line fails as it does not know what T is here
{
    public T Convert<T>(string source, T destination, ResolutionContext context)
    {
        return EnumExtensions.ParseString<T>(source);
    }
}

Но мои знания о том, какиспользование T довольно ограничено, так что, очевидно, это не работает.Возможно ли это даже с унаследованным классом?

1 Ответ

0 голосов
/ 01 марта 2019

У вас есть две проблемы:

1) Необходимо включить параметр универсального типа в класс StringToEnumConverter, чтобы его можно было передать в определение интерфейса

2) Вам нужноограничить универсальный тип, так как ваш метод синтаксического анализатора ограничен

public sealed class StringToEnumConverter<T> : ITypeConverter<string, T>
    where T : struct
{
    public T Convert(string source, T destination, ResolutionContext context)
    {
        return EnumExtensions.ParseString<T>(source);
    }
}

Если вы сделаете это, он должен работать нормально:

Mapper.Initialize(cfg =>
                  {
                      cfg.CreateMap<string, GuaranteeType>().ConvertUsing(new StringToEnumConverter<GuaranteeType>());
                      cfg.CreateMap<string, WhyChooseType>().ConvertUsing(new StringToEnumConverter<WhyChooseType>());
                  });

WhyChooseType instance = Mapper.Map<WhyChooseType>("2");
...