Как представлены единицы измерения?
Я только начинаю с F# и задаюсь вопросом о единицах измерения:
Я понимаю, что они присутствуют только во время компиляции, и Reflector подтверждает это: создание единицы измерения, которая не является псевдонимом, создает класс с MeasureAttribute
атрибут, но кроме этого, float<km/h>
представляется в виде простого System.Double
, И нет никаких атрибутов типа, параметра конструктора или свойств.
Пока я понимаю. Но когда я ссылаюсь на скомпилированную сборку из другого проекта, она, кажется, знает все о единицах измерения, включая псевдонимы. Как он получает эту информацию? Где в сборке они?
1 ответ
F# хранит "дополнительную информацию о типе" в ресурсе скомпилированной сборки, и компилятор F# знает, как читать этот ресурс. Таким образом, в то время как дискриминационное объединение просто скомпилировано, скажем, в класс, а единица измерения стерта в двойное число, в ресурсе сборки есть дополнительная информация о типе, специфичная для F#, поэтому, когда компилятор F# читает его, он может восстановите дополнительные "метаданные F#".
PowerPack имеет устройство чтения метаданных, которое позволяет вам обращаться к нему программно.