У меня есть функция, которая может возвращать разные типы, и для этого я использую размеченное объединение. Что мне нужно, так это преобразование одного типа в размеченное объединение в другой тип. Также некоторые типы могут быть преобразованы во все другие типы (String), но некоторые типы могут быть преобразованы только в String (MyCustomType).
Для этого я добавил метод члена ConvertTo в ResultType
:
type MyTypes =
| Boolean = 1
| Integer = 2
| Decimal = 3
| Double = 4
| String = 5
| MyCustomType = 6
type ResultType =
| Boolean of bool
| Integer of int
| Decimal of decimal
| Double of double
| String of string
| MyCustomType of MyCustomType
with
member this.ConvertTo(newType: MyTypes) =
match this with
| ResultType.Boolean(value) ->
match newType with
| MyTypes.Boolean ->
this
| MyTypes.Integer ->
ResultType.Integer(if value then 1 else 0)
...
| ResultType.MyCustomType(value) ->
match newType with
| MyTypes.MyCustomType ->
this
| MyTypes.String ->
ResultType.String(value.ToString())
| _ ->
failwithf "Conversion from MyCustomType to %s is not supported" (newType.ToString())
Мне не нравится такая конструкция, потому что если я добавлю больше типов, это потребует от меня много изменений: MyTypes, ResultType, а также в нескольких местах в ConvertTo функция-член.
Кто-нибудь может предложить лучшее решение для преобразования таких типов?
заранее спасибо