作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们看下面的代码,并假定MyAttribute
和test
函数都不能更改。
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。
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/
我是一名优秀的程序员,十分优秀!