gradientspace / geometry3Sharp

C# library for 2D/3D geometric computation, mesh algorithms, and so on. Boost license.
http://www.gradientspace.com
Boost Software License 1.0
1.69k stars 380 forks source link

3196 string to colorf type converter #178

Closed CriggerMarg closed 2 years ago

CriggerMarg commented 2 years ago

Чтобы иметь возможность использовать hex цвета в конфигурации, нам надо иметь возможность конвертировать строки в Colorf, собственно.

Из-за того, как работает чтение конфигурации в дотнете, мы не можем контролировать процесс десериализации json конфига в инстанс класса напрямую.

Чтение конфигурации в дотнете разбито на две части:

  1. Использование провайдера для чтения конфига из произвольного источника в словарь ключ:значение.
  2. Использование внутренних дотнент вещей для инстанциации классов конфигурации.

И если первую часть мы выбираем сами (в нашем случае через вызов метода .AddJsonFile()), то вторая не настолько гибка и единственный способ повлиять на то, как будут сопоставляться строковые ключи из вышеупомянутого словаря на поля классов конфигураций - использовать TypeConverter.

Для того чтобы разобраться как эта конвертация работает, мне пришлось вытащить исходники System.ComponentModel, подебажить и тогда я догадался, что конвертер надо вешать не на свойство с типом Colorf, а на сам тип ColorF. Дело тут в том, что код в дотнете смотрит на атрибуты типа а не на атрибуты свойства класса, на которое будет мапить значение.

Поэтому пришлось код атрибута и парсер перенести в g3.

Если есть идеи получше - с удовольствием выслушаю