F#字符串到枚举的转换

bug*_*oot 3 string enums f# type-conversion

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

public enum MyEnum {
    ValueA,
    ValueB,
    ValueC}
Run Code Online (Sandbox Code Playgroud)

我想在我的F#模块中将字符串转换sMyEnum等效字符串(如果可能)。试图像...

let myEnumValue = (MyClass.MyEnum) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)

...给我无效使用类型名称和/或对象构造函数的信息。如有必要,请使用“ new”并将构造函数应用于其参数...错误。如果使用typeof<MyClass.MyEnum>代替,则相同typedefof<MyClass.MyEnum>。试...

let myEnumValue = (typedefof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)

...要么...

let myEnumValue = (typeof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我需要将字符串转换为枚举,因为MyEnum使用.ToString()会将某些值序列化为XML,并且将从XML反序列化的枚举作为参数传递给F#函数。
  • 不希望使用int等价MyEnum于XML的读写操作,因为XML应该是人类可读的,而且 值的int等价物MyClass比的等价物更可能更改.ToString()

Wal*_*lly 5

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

在F#中,您向下广播如下:

let myEnumValue = Enum.Parse(typedefof<MyClass.MyEnum>, s) :?> MyClass.MyEnum
Run Code Online (Sandbox Code Playgroud)