Когда вы имеете отношение типа «многие ко многим» (например, каждое значение хочет иметь возможность преобразовать его в любой другой тип значения в своем классе), стоит обратить внимание на то, что вы в конечном итоге напишите тонну методы, если вы используете метод грубой силы написания функции преобразования для каждой возможности.
Это нормально, если вам нужно, чтобы это работало как можно быстрее и вы хотели, чтобы ваша ошибка контролировалась, но вы страдаете из-за удобства сопровождения кода.
Что-то, что я делал в прошлом для конвертации между многими единицами, было установление «базовой» единицы, в которую можно преобразовать все, и написание функций для преобразования в / из этого. Это позволяет вам определять интерфейс примерно так:
interface IUnitConverter<T, U> {
T ToBaseUnit();
void FromBaseUnit(T BaseValue);
U MyValue {get;}
}
И специализировать это для определенных типов конвертации:
class RadiansConverter : IUnitConverter<DegreesConverter, float> {
float radians = 0;
DegreesConverter ToBaseUnit() {...}
void FromBaseUnit(DegreesConverter BaseValue) {...}
float MyValue {get {return radians;}}
}
Редактировать: Использование:
// assume we have a constructor that sets the private value
float degrees = new RadiansConverter(Math.PI).ToBaseUnit().MyValue;
float radians = new RadiansConverter().FromBaseUnit(degrees).MyValue;
Это может быть несколько тяжеловесно, и вы должны следить за распространением ошибок, которые могут ударить вас по двум преобразованиям вместо одного. Это пригодилось, когда мне нужно было выполнять сложные преобразования ГИС, для которых также требовалось сохранять состояние, но это может быть не совсем то, что вы ищете.