Использование поставщика типов F# для создания экземпляров типов и их представления в виде свойств

Я хотел бы сделать следующее:

let allTypes = AllTypes (t, assemblies)

... где AllTypes — поставщик типов, свойствами которого являются экземпляры всех типов в заданном массиве сборок, которые являются подклассами типа t. (Все типы имеют один конструктор, не принимающий аргументов.)

Возможно ли это с помощью поставщиков типов F#? У меня нет опыта создания собственного провайдера, и я не хочу тратить время на попытки сделать это, если это невозможно.

Я был бы очень признателен за любые ссылки на страницы, которые помогут мне начать кодировать это.


person MiloDC    schedule 10.10.2014    source источник


Ответы (2)


в репозитории FSharp.Data github происходит много активности. Существует кривая обучения, но настройка этого репозитория может быть полезной.

Кроме того, в этом вступительном руководстве рассматриваются некоторые основы, а вот Стартовый пакет Type Provider, подготовленный сообществом F# с открытым исходным кодом.

Сайт fsharp.org и этот страница проектов охватывает все, что происходит (включая поставщиков типов).

Вы можете взять список, предложенный Марком, и превратить его в поставщика типов. Я думаю, что исследовательский способ взаимодействия с пространствами имен был бы полезен. Почему бы нет? Я бы использовал это. Пожалуйста, опубликуйте на GitHub, если у вас получится.

person sgtz    schedule 10.10.2014

Для этого вам не нужен поставщик типов; вы можете написать этот код, используя базовое отражение:

open System.Reflection

let allTypes (baseClass : Type) (assemblies : Assembly seq) =
    assemblies
    |> Seq.collect (fun x -> x.GetExportedTypes())
    |> Seq.filter (fun x -> baseClass.IsAssignableFrom x)
    |> Seq.collect (fun x -> x.GetConstructors())
    |> Seq.filter (fun x -> x.GetParameters().Length = 0)
    |> Seq.map (fun x -> x.Invoke([||]))

Функция allTypes имеет следующую подпись: Type -> Assembly seq -> obj seq.

person Mark Seemann    schedule 10.10.2014
comment
Да, я мог бы сделать что-то подобное (на самом деле я уже написал эту часть кода). Дело в том, что я хочу, чтобы типы отображались как свойства, чтобы использовать разрешение этих значений во время компиляции. (Не нужно их разыгрывать, всплывающее окно Intellisense и т. д.) - person MiloDC; 11.10.2014
comment
Что вы подразумеваете под свойствами? - person Mark Seemann; 11.10.2014
comment
@MiloDC Это может быть только я, но мне не ясно, как свойства относятся к списку объектов, производных от базового класса ... - person Mark Seemann; 12.10.2014
comment
вместо свойства класса, возвращающего список объектов, представьте одно свойство для каждого объекта. Есть несколько преимуществ: гетерогенные типы, знание типов во время компиляции, обнаружение Intellisense, отсутствие необходимости их экземпляра и др. - person MiloDC; 12.10.2014