繁体   English   中英

F#中的枚举字符串

[英]Enums in F# for strings

我正在开发一个遗留数据库,没有我可以修改的系统。 由于类型提供程序,我决定使用F#。 我现在并不是那么简单。 如何在我的数据库中构建一个只包含以下字符串的字段? 它有点像ENUM。 我尝试了以下但是还没有完全理解。

尝试1

type SuspendedDriver = "SI"
type ActiveDriver = "IMPRESO"
type Applicant = "NO"
type TemporaryDriver = "TEMP"
type Uncertain = "NULL"

type DriverStatus =
    | SuspendedDriver
    | ActiveDriver
    | Applicant
    | TemporaryDriver
    | Uncertain

type Driver = {
    status : DriverStatus
    }

错误

Error FS0618: Invalid literal in type (FS0618) (ScriptTest)

尝试2

type DriverStatus =
    | SuspendedDriver = "SI"
    | ActiveDriver = "IMPRESO"
    | Applicant = "NO"
    | TemporaryDriver = "TEMP"
    | Uncertain = "NULL"

错误

Error FS0951: Literal enumerations must have type int, uint, int16,
uint16, int64, uint64, byte, sbyte or char (FS0951) (ScriptTest)

正如评论中所提到的,您无法定义具有擦除字符串值的枚举。 枚举只能是整数(各种类型)。

以丑陋的方式使用枚举

可以使用枚举字段的实际名称,然后使用Enum.Parse解析它们,但这可能不是一个好主意,因为枚举案例将是相当模糊的代码。 但只是为了记录,以下工作:

type DriverStatus =
   | SI = 0

System.Enum.Parse(typeof<DriverStatus>, "SI") :?> DriverStatus

清洁解析为歧视联盟

在实践中,我会做Sam推荐的并编写一个函数来解析数据库中的字符串。 这样做的好处是,您需要弄清楚如何处理数据库中的错误(值总是出错):

type DriverStatus =
   | SuspendedDriver
   | ActiveDriver

let parseDriverStatus = function
   | "SI" -> SuspendedDriver
   | "IMPRESO" -> ActiveDriver 
   | code -> failwith (sprintf "Wrong driver code! %s" code)

使用酷的Enum SQL提供程序

最后,如果您碰巧使用MS SQL数据库,那么SQL命令提供程序项目有一个简洁的功能,允许您自动从SQL数据库本身导入类似枚举的类型,这实际上可能正是您在这种情况下所需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM