2017-02-02 13 views
1

Я использую привязку конфигурации в решении ASP.NET Core 1.1. В принципе, у меня есть простой код для связывания в моем ConfigureServices Startup раздела, который выглядит следующим образом:Пользовательское связующее свойство для свойства

services.AddSingleton(Configuration.GetSection("SettingsSection").Get<SettingsClass>()); 

Морщинка, что мой класс как Int собственность, который обычно связан с целочисленным значением в файле конфигурация, но может быть привязан вместо строки «disabled». Под капотом я хочу, чтобы свойство получило значение -1, если оно привязано к строке «disabled».

Это может быть сложнее, чем это, но я упрощаю ради краткости.

Мой вопрос заключается в следующем: Как предоставить настраиваемый связующий/конвертер для этого переопределяет привязку конфигурации для определенного свойства в SettingsClass, поэтому при выполнении преобразования строки он преобразует «отключен» в -1, а не бросает исключение, которое «отключено» не может быть преобразовано в Int32?

ответ

1

Похоже, что поскольку ConfigurationBinder использует TypeDescriptor типа для получения конвертера, единственный способ сделать то, что я пытаюсь сделать, - это реализовать настраиваемый конвертер типов и вставить его в TypeDescriptor для класса I преобразуется в (в этом случае Int32).

Таким образом, в основном, добавьте это до конфигурации происходит:

TypeDescriptor.AddAttributes(typeof(int), new TypeConverterAttribute(typeof(MyCustomIntConverter))); 

Где MyCustomIntConverter выглядит примерно так:

public class MyCustomIntConverter : Int32Converter 
{ 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     if (value != null && value is string) 
     { 
      string stringValue = value as string; 
      if(stringValue == "disabled") 
      { 
       return -1; 
      } 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
} 

кажется излишним, так как сейчас "отключено" всегда будет Конвери до -1 для Int32 в любом месте приложения. Если кто-нибудь знает менее инвазивный способ сделать это, пожалуйста, дайте мне знать.