用于枚举转换的F#字符串

时间:2014-10-26 13:08:45

标签: string enums f# type-conversion

我在C#.NET DLL中的名称空间MyClass中的公共类MyNamespace中有以下枚举:我引用并从我的F#模块打开:

public enum MyEnum {
    ValueA,
    ValueB,
    ValueC}

我想在我的F#模块中将字符串s转换为其MyEnum等价物(如果可能)。试图实现它... ...

let myEnumValue = (MyClass.MyEnum) (Enum.Parse(typedefof<MyClass.MyEnum>, s))

...给我无效使用类型名称和/或对象构造函数。如有必要,请使用&#39; new&#39;并将构造函数应用于其参数... 错误。如果我使用typeof<MyClass.MyEnum>而不是typedefof<MyClass.MyEnum>,则相同。尝试...

let myEnumValue = (typedefof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))

...或...

let myEnumValue = (typeof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))

...给我该值不是函数且无法应用错误 我在F#代码的其他部分使用MyEnum,所以我猜我的C#.NET DLL没有问题。

为了避免一些可能的问题: - )

  • 我需要将字符串转换为枚举,因为某些MyEnum值是 使用.ToString()序列化为XML并反序列化枚举 来自XML将作为参数传递给F#函数
  • 使用int等效的MyEnum来写入和读取 XML是不受欢迎的,因为XML应该是人类可读的,而且更有可能是int等价的MyClass 值要更改,而不是.ToString()

1 个答案:

答案 0 :(得分:4)

您的代码的问题是您尝试将Object(由Parse方法返回)转换为MyClass.MyEnum实例的方式。您尝试的语法导致“无效使用类型名称”错误。

在F#中,你按照以下方式进行了下载:

let myEnumValue = Enum.Parse(typedefof<MyClass.MyEnum>, s) :?> MyClass.MyEnum