enums - 如何在枚举中保留值类型

标签 enums f# attributes value-type

让我们看下面的代码,并假定MyAttributetest函数都不能更改。

type MyAttribute() =
    inherit Attribute()

    let mutable prop = null

    member this.Prop
        with get(): obj = prop
        and  set(value) = prop <- value


type MyEnum = 
    | A = 1
    | B = 2

[<My(Prop = MyEnum.B)>]
type MyClass = class
    end

let test () =
   let t = typeof<MyClass>
   let a = t.GetCustomAttributes(false).[0] :?> MyAttribute

   let e = a.Prop
   Convert.ToString(e, Globalization.CultureInfo.CurrentCulture)

我希望test返回B但它返回2。生成的IL代码显示有关枚举类型的信息丢失,并且传递给属性的值仅为2。

有什么办法(我想应该是某种属性)来保留属性值中的类型? C#中更有趣的等效代码可以按预期工作

等效的C#:
class MyAttribute : Attribute
{
    public object A { get; set; }
}

enum T { A,B,C }

[My(A = T.A)]
class MyClass
{ }

var a = typeof(MyClass).GetCustomAttributes(false)[0] as MyAttribute;

Convert.ToString(a.A, System.Globalization.CultureInfo.CurrentCulture)

最佳答案

我正在猜测,并且我对编译器内部的知识实际上很有限,但是我想这与类型推断有关。 int <-> Enum之间有一个等效项,我怀疑类型推断会将其减小为可能的最低类型,在这种情况下为int。您可以通过以下操作解决此问题

open System

type MyAttribute() =
    inherit Attribute()

    let mutable prop = null

    member this.Prop
        with get(): obj = prop
        and  set(value) = prop <- value


type MyEnum = 
    | A = 1
    | B = 2

[<My(Prop = MyEnum.B)>]
type MyClass = class
    end

let test () =
   let t = typeof<MyClass>
   let a = t.GetCustomAttributes(false).[0] :?> MyAttribute

   let e = a.Prop :?> MyEnum //Note
   Convert.ToString(e, Globalization.CultureInfo.CurrentCulture)

关于enums - 如何在枚举中保留值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732830/

相关文章:

f# - 在 F# 中连接字符串的次数

F#:[<StructuredFormatDisplay>] 与覆盖 __.ToString()。 ¿怎么了?

java - 迭代 Map 条目时如何避免 DuplicateFormatFlagsException

unit-testing - 如何使用 f# 编写带有模拟的测试

c# - 枚举未设置时会发生什么?

.net - ASP.NET Core 1.0 F#项目

python - 父标签的子标签有特定属性值时,如何使用BeautifulSoup获取父标签名称值?

http - 了解 http post 请求的属性

java - 为 enum.ordinal 生成编译器警告

.net - .NET JIT 编译器是否为使用不同枚举参数化的泛型生成不同的代码?