簡體   English   中英

F#計量單位的反射

[英]Reflection for F# units of measure

F#當前已添加對反射的支持,但不適用於度量類型。 是否可以將F#中的反射用於度量類型? 我已經讀過 那是在2008年,但是如果您在ildasm中檢查像波紋管這樣的代碼,則看不到任何有關Units of Measure

// Learn more about F# at http://fsharp.net

[<Measure>] type m
[<Measure>] type cm

let CalculateVelocity(length:float<m> ,time:float<cm>) =
    length / time

ildasm輸出:

.method public static float64  CalculateVelocity(float64 length,
                                                 float64 time) cil managed
{
  // Code size       5 (0x5)
  .maxstack  4
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  div
  IL_0004:  ret
} // end of method Program::CalculateVelocity

因此有些事情無法在F#中反映出來。 是真的嗎? 請參閱評論:本文中的CLR實際上根本看不到單位...。

正如其他人已經指出的那樣,當您需要獲取有關已編譯F#類型的某些信息時,可以使用標准.NET反射( System.Reflection )和F#反射,它們提供有關已區分的並集,記錄等的信息。( Microsoft.FSharp.Reflection )。

遺憾的是,無法使用這兩個API中的任何一個來訪問有關度量單位的信息,因為它們僅在編譯期間檢查並且在運行時實際上不存在(它們無法以任何方式在CLR中表示)。 這意味着您將永遠無法發現例如盒裝浮點值是否具有某種度量單位...

您可以使用F#PowerPack中的Metadata名稱空間獲取有關度量單位的一些信息。 例如,以下顯示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

這將讀取編譯器存儲在已編譯文件中的一些二進制元數據(以便在引用其他F#庫時可以看到單位),因此您應該能夠查看有關F#庫的公共API的信息。

度量單位只是一個編譯時的東西,在程序集/ CLR中不存在。

在第一部分中

度量單位不僅是方便的基於常量的注釋:它們存在於值的類型中,而且,F#編譯器知道單位的規則。

您可以:

.NET和F#反射

F#庫還擴展了.NET System.Reflection以提供有關F#數據類型的其他信息。

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM