Подтвердить что ты не робот

Как создать поставщик типа F #, который можно использовать с С#?

Если я использую поставщиков типов F # из сборки FSharp.Data.TypeProviders 4.3.0.0, я могу создавать типы в очень простой библиотеке F #. Затем я могу использовать эти типы без какой-либо зависимости от сборки FSharp.Data.TypeProviders. Это очень мило! Вот пример:

Я создал проект библиотеки F # под названием TryTypeProviders. Я помещал это в .fs:

module TryTypeProviders
type Northwind = Microsoft.FSharp.Data.TypeProviders.ODataService

Затем я могу использовать библиотеку F # из проекта С#:

public static void Main()
{
    var c = new TryTypeProviders.Northwind();
    foreach (var cust in c.Customers)
        Console.WriteLine("Customer is: " + cust.ContactName);
    Console.ReadKey(true);
}

Мне не удалось найти какие-либо рабочие примеры создания такого типа, как это. Поставщики типов в FSharpx.TypeProviders недоступны из С#. Я предполагаю, что они стирают типы и не сгенерированные типы. Я все еще немного нечеткий, на котором есть, но он определен здесь как:

  • Сгенерированные типы - это реальные типы .NET, которые внедряются в сборку, которая использует поставщика типов (это то, что поставщики типов, которые используют инструменты генерации кода, такие как sqlmetal)
  • Стираемые типы - это моделируемые типы, которые представляются другим типом при компиляции кода.

Образцы из F # 3.0 Sample Pack, упомянутые в MSDN tutorial не работают для меня. Они строят, но когда я пытаюсь их использовать, я получаю ошибки.

open Samples.FSharp.RegexTypeProvider
type PhoneNumberRegEx = CheckedRegexProvider< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
open Samples.FSharp.MiniCsvProvider
type csv = MiniCsvProvider<"a.csv">

Последний выпуск был выпущен в марте 2011 года, и я предполагаю, что они еще не отражают окончательную версию поставщиков типов, поставляемых с Visual Studio 2012.

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

4b9b3361

Ответ 1

Причина, по которой поставщики стандартного типа (для OData, LINQ to SQL и WSDL) работают с С#, заключается в том, что они генерируют реальные типы .NET за крышкой. Это называется поставщиком генерирующего типа. Фактически, они просто называют инструмент генерации кода, который будет вызываться, если бы вы использовали эти технологии с С# стандартным образом. Таким образом, эти поставщики типов являются просто оболочками над некоторыми стандартными инструментами .NET.

Большинство недавно созданных провайдеров написаны как поставщики типов стирания. Это означает, что они генерируют только "поддельные" типы, которые сообщают компилятору F #, какие члены могут быть вызваны (и т.д.), Но когда компилятор компилирует их, "поддельные" типы заменяются другим кодом. Вот почему вы не можете видеть какие-либо типы при использовании библиотеки с С# - ни один из типов не существует в скомпилированном коде.

Если вы не обертываете существующий генератор кода, проще написать стираемый поставщик типов, и поэтому большинство примеров написаны таким образом. У поставщиков типа стирания есть другие преимущества - то есть они могут генерировать огромное количество "поддельных" типов без создания чрезмерно больших сборок.

Во всяком случае, в учебнике MSDN есть краткое примечание "Предоставление сгенерированных типов" , в котором есть некоторые советы по написанию генеративных поставщиков. Однако я ожидаю, что большинство новых поставщиков типов F # будут записаны как стирающиеся. Он отмечает, что у вас должна быть настоящая сборка .NET(с генерируемыми типами) и получение этого не упрощается с помощью помощников F # для создания типов поставщиков - так что вам нужно будет испустить IL для сборки или сгенерировать код С#/F # и скомпилировать это (например, используя CodeDOM или Roslyn).