C# F#度量单位的反思
对反射的支持目前已添加到F#中,但它不适用于度量类型。对于度量类型,是否可以使用F#中的反射? 我读过。这是2008年的,但是如果你在ildasm中检查一些代码,比如bellow,你就看不到任何关于测量单位的信息C# F#度量单位的反思,c#,reflection,f#,C#,Reflection,F#,对反射的支持目前已添加到F#中,但它不适用于度量类型。对于度量类型,是否可以使用F#中的反射? 我读过。这是2008年的,但是如果你在ildasm中检查一些代码,比如bellow,你就看不到任何关于测量单位的信息 // Learn more about F# at http://fsharp.net [<Measure>] type m [<Measure>] type cm let CalculateVelocity(length:float<m> ,t
// Learn more about F# at http://fsharp.net
[<Measure>] type m
[<Measure>] type cm
let CalculateVelocity(length:float<m> ,time:float<cm>) =
length / time
因此,有些东西不能反映在F#中。这是真的还是假的?
请参阅注释:CLR实际上根本看不到单位。。。在文章中。您可以:
.NET和F#反射
F#库还扩展了.NETSystem.Reflection
,以提供有关F#数据类型的更多信息
度量单位只是编译时的东西,它不存在于汇编/CLR中 发件人: 计量单位不仅仅是方便的 常量注释:它们在那里 在值的类型中,以及 此外,F#编译器知道规则 单位的数量
正如其他人已经指出的那样,当您需要获取有关已编译F#类型的一些信息时,可以使用标准的.NET反射(
System.reflection
)和F#reflection,后者提供有关有区别的联合、记录等的信息(Microsoft.FSharp.reflection
)
不幸的是,无法使用这两个API中的任何一个来访问有关度量单位的信息,因为它们仅在编译期间被检查,并且在运行时并不实际存在(它们不能以任何方式在CLR中表示)。这意味着您将永远无法确定盒装浮点值是否具有某种度量单位
您可以使用F#PowerPack中的元数据名称空间获取有关度量单位的一些信息。例如,以下打印的foo
是一个单位:
namespace App
open System.Reflection
open Microsoft.FSharp.Metadata
[<Measure>]
type foo
module Main =
let asm = FSharpAssembly.FromAssembly(Assembly.GetExecutingAssembly())
for ent in asm.Entities do
if ent.IsMeasure then
printfn "%s is measure" ent.DisplayName
命名空间应用程序
开放系统。反射
打开Microsoft.FSharp.Metadata
[]
foo型
主模块=
设asm=FSharpAssembly.FromAssembly(Assembly.getExecutionGassembly())
对于asm中的ent.Entities
如果是测量的话
printfn“%s是度量值”ent.DisplayName
这将读取编译器存储在编译文件中的一些二进制元数据(以便在引用其他F#库时可以看到单位),因此您应该能够看到有关F#库的公共API的信息。@SaeedAlg-关于反射的部分从页面的一半开始。它们确实存在于程序集中,但它们被编码在资源中,而不是成员的签名中。请参阅Tomas的答案,以了解可以在运行时恢复单元的演示。
namespace App
open System.Reflection
open Microsoft.FSharp.Metadata
[<Measure>]
type foo
module Main =
let asm = FSharpAssembly.FromAssembly(Assembly.GetExecutingAssembly())
for ent in asm.Entities do
if ent.IsMeasure then
printfn "%s is measure" ent.DisplayName