28

アセンブリFSharp.Data.TypeProviders4.3.0.0のF#型プロバイダーを使用すると、非常に単純な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#からアクセスできません。私の推測では、それらは消去されたタイプであり、生成されたタイプではありません。私はまだどちらがどちらかについて少し曖昧ですが、ここでは次のように定義されています

  1. 生成された型は、型プロバイダーを使用するアセンブリに埋め込まれる実際の.NET型です(これは、sqlmetalなどのコード生成ツールをラップする型プロバイダーが使用するものです)
  2. 消去された型は、コードがコンパイルされるときに他の型によって表されるシミュレートされた型です。

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月に最後にリリースされましたが、VisualStudio2012に付属しているタイププロバイダーの最終バージョンはまだ反映されていないと思います。

F#タイププロバイダーは優れたテクノロジーのように見えますが、それらを構築するための支援が必要です。どんな助けでも大歓迎です。

4

1 に答える 1

39

標準型プロバイダー (OData、LINQ to SQL、および WSDL 用) が C# で動作する理由は、それらが背後で実際の .NET 型を生成するためです。これは生成型プロバイダーと呼ばれます。実際、標準的な方法で C# からこれらのテクノロジを使用していた場合に呼び出されるコード生成ツールを呼び出すだけです。したがって、これらの型プロバイダーは、一部の標準 .NET ツールの単なるラッパーです。

新しく書かれたプロバイダーのほとんどは、消去型プロバイダーとして書かれています。これは、どのメンバーを呼び出すことができるか (など) を F# コンパイラに伝える "偽の" 型のみを生成することを意味しますが、コンパイラがそれらをコンパイルすると、"偽の" 型は他のコードに置き換えられます。これが、C# からライブラリを使用しているときに型が表示されない理由です。コンパイルされたコードには実際には型が存在しません。

既存のコード ジェネレーターをラップしない限り、消去された型プロバイダーを記述する方が簡単であるため、ほとんどの例はこの方法で記述されています。消去型プロバイダーには、他にも利点があります。つまり、過度に大きなアセンブリを生成することなく、膨大な数の「偽の」型を生成できます。

とにかく、 MSDN チュートリアル に「生成された型の提供」という短いメモがあり、生成プロバイダーの作成に関するヒントがいくつかあります。ただし、新しい F# 型プロバイダーのほとんどは、消去として記述されることを期待しています。実際の .NET アセンブリ (生成された型を含む) が必要であり、その取得は型プロバイダーを構築するための F# ヘルパーによって単純化されないことに注意してください。そのため、アセンブリの IL を発行するか、C#/F# コードを生成する必要があります。それをコンパイルします (つまり、CodeDOM または Roslyn を使用します)。

于 2012-08-25T03:38:21.973 に答える