Как уже отмечали другие, когда вам нужно получить некоторую информацию о скомпилированных типах F #, вы можете использовать стандартные отражения .NET (System.Reflection
) и отражение F #, которые предоставляют информацию о различимых объединениях, записях и т. Д. (Microsoft.FSharp.Reflection
).
К сожалению, информация о единицах измерения не может быть доступна с помощью любого из этих двух API, поскольку они проверяются только во время компиляции и фактически не существуют во время выполнения (они не могут быть представлены в CLR в тем не мение). Это означает, что вы никогда не сможете узнать, например, в штучной упаковке значение с плавающей точкой имеет некоторую единицу измерения ...
Вы можете получить некоторую информацию о единицах измерения, используя Metadata
пространство имен из 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
При этом считываются некоторые двоичные метаданные, которые компилятор хранит в скомпилированных файлах (чтобы вы могли видеть единицы при обращении к другим библиотекам F #), поэтому вы должны иметь возможность видеть информацию об открытом API библиотек F #.