如何创建可以从C#使用的F#Type Provider?

如果我使用程序集FSharp.Data.TypeProviders 4.3.0.0中的F#Type Providers,我可以在一个非常简单的F#库中创建类型。 然后我可以使用这些类型,而不依赖于程序集FSharp.Data.TypeProviders。 这真是太棒了! 这里是一个例子:

我创建了一个名为TryTypeProviders的F#库项目。 我把它放在.fs中:

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

然后我可以使用C#项目中的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中的类型提供程序不能从C#访问。 我的猜测是他们是擦除类型,而不是生成类型。 我仍然有点模糊,哪个是哪个,但它在这里被定义为:

  • 生成的类型是真正的.NET类型,它们嵌入到使用类型提供程序的程序集中(这是用于包装代码生成工具的类型提供程序,如sqlmetal使用)
  • 擦除类型是模拟类型,在代码编译时由其他类型表示。
  • MSDN教程中提到的来自F#3.0示例包的示例不适合我。 他们构建,但是当我尝试使用它们时,我会遇到错误。

    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年3月发布,我的猜测是它们尚未反映Visual Studio 2012附带的类型提供程序的最终版本。

    F#类型提供程序看起来像一个伟大的技术,但我们需要帮助构建它们。 任何帮助表示赞赏。


    标准类型提供程序(用于OData,LINQ to SQL和WSDL)与C#一起工作的原因是它们在封面后面生成真正的.NET类型。 这被称为生成型提供者 。 事实上,他们只是简单地调用代码生成工具,如果您以标准方式使用C#中的这些技术,就会调用它。 所以,这些类型的提供者只是一些标准.NET工具的包装。

    新编写的大多数提供程序都是作为擦除类型提供程序编写的。 这意味着它们只会生成告诉F#编译器哪些成员可以被调用的“假”类型(等等),但是当编译器编译它们时,“假”类型会被替换为其他代码。 这就是为什么当你使用C#中的库时看不到任何类型的原因 - 编译后的代码中实际上不存在任何类型。

    除非你打包现有的代码生成器,否则编写擦除类型的提供者会更容易,所以大多数示例都是以这种方式编写的。 擦除类型的提供者有其他的好处 - 即它们可以产生大量的“假”类型而不会产生过大的程序集。

    无论如何,在MSDN教程中有一个简短的提示“提供生成类型”,它对编写生成提供者有一些提示。 不过,我希望大多数新的F#类型提供者被写为擦除。 它注意到你必须有一个真正的.NET程序集(使用生成的类型),并且不会被F#助手用于构建类型提供程序的简化 - 所以你需要发出程序集的IL或生成C#/ F#代码并编译(即使用CodeDOM或Roslyn)。

    链接地址: http://www.djcxy.com/p/86117.html

    上一篇: How do I create an F# Type Provider that can be used from C#?

    下一篇: Exceptions in F# when running on Azure