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