Отражение для единиц измерения F # - PullRequest
8 голосов
/ 23 октября 2010

Поддержка отражения была добавлена ​​в 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 ... в статье.

Ответы [ 3 ]

18 голосов
/ 24 октября 2010

Как уже отмечали другие, когда вам нужно получить некоторую информацию о скомпилированных типах 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 #.

3 голосов
/ 24 октября 2010

Единицы измерения - это просто время компиляции, его нет в сборке / CLR.

С часть первая :

Единицы измерения - это не просто удобные комментарии-константы: они присутствуют в типах значений, и, более того, компилятор F # знает правила единиц измерения.

1 голос
/ 23 октября 2010

Вы можете:

.NET и F # Reflection

Библиотека F # также расширяет .NET System.Reflection для предоставления дополнительной информации о типах данных F #

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...