@D8i

Можно ли методом .Configure() конфигурировать другие типы, кроме стандартных?

Имеется класс с методами: Emote.Parse(string) - возвращает Emote, Emote.TryParse(string) - возвращает bool и др.

Есть класс параметров:
public class EmotesOptions
{
    public Emote CheckMark { get; set; }
    public Emote Clock { get; set; }
}


Можно ли как-то сконфигурировать приведенный выше тип с помощью Options pattern?
Такая реализация, очевидно, у меня не сработала:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<EmotesOptions>(Configuration.GetSection("Emotes");
}


Может можно что-то изменить в этом методе, чтобы конфигурация брала string из файла, а преобразовывала к новому типу?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@D8i Автор вопроса
Ответ на вопрос нашел:

Воспользуемся Type Converter.

Создадим класс EmotesConverter, зависимый от TypeConverter с таким содержимым:

public class EmotesConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) ||
               base.CanConvertFrom(context, sourceType);
    }
        
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        return value is string emoteString
            ? Emote.Parse(emoteString)
            : base.ConvertFrom(context, culture, value);
    }
}


Добавим атрибут в класс опций:

[TypeConverter(typeof(EmotesConverter))]
public class EmotesOptions
{
    public Emote CheckMark { get; set; }
    public Emote Clock { get; set; }
}


И определим Type Converter при конфигурации сервисов:

public void ConfigureServices(IServiceCollection services)
{
    TypeDescriptor.AddAttributes(typeof(Emote), new TypeConverterAttribute(typeof(EmotesConverter)));
    services.Configure<EmotesOptions>(Configuration.GetSection("Emotes");
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы