C# F#度量单位的反思

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

对反射的支持目前已添加到F#中,但它不适用于度量类型。对于度量类型,是否可以使用F#中的反射? 我读过。这是2008年的,但是如果你在ildasm中检查一些代码,比如bellow,你就看不到任何关于测量单位的信息

// 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#库还扩展了.NET
System.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