静的にパラメータ化された静的メソッドを持つ型を提供する、静的にパラメータ化された新しい型プロバイダを使いこなしています。私は許可されていないことについての文書を見つけられませんでした。私はいくつかの奇妙なタイププロバイダの動作を取得しています:TypeProviderの予期しない開発時の動作
このタイプのプロバイダのかかるコードが正しく実行されますがインテリセンスが安っぽいの情報を提供します。メンバーは追加され続けますが、削除されることはありません。 OpDefメソッドは型パラメータなしでは使用できないはずですが、intellisenseちょっとしたことがオプションとして表示されていますが、私が実際に参照すると、行方不明の呼び出し側に関するエラーが表示されます。提供されたOpDefメソッドに必要な引数は表示されません - 私が現在見たいと思っているOpDef(suffix : string * id : string) -> unit
ではなく、常にOpDef() -> unit
と表示されます(このタイププロバイダのドラフトから)。しかし、私が本当に必要とするすべての議論をしたので、それは不平を言い止める。
私はサポートされていないか、正しいものをやっていますか?あるいは、間違いなく、f#にバグがあります(バグがどこにあるのか分かりますか?)。
ここには、スターターパックファイルを使用する完全な実装があります。
namespace OfflineSql
open ProviderImplementation.ProvidedTypes
open Microsoft.FSharp.Core.CompilerServices
open System.Text.RegularExpressions
#nowarn "0025"
[<TypeProvider>]
type OfflineSqlProvider (config : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces()
let ns = "OfflineSql"
let asm = System.Reflection.Assembly.GetExecutingAssembly()
let buildDomainProvider nm schema invariants =
let parameterizedType = ProvidedTypeDefinition(asm, ns, nm, None)
let m = ProvidedMethod("OpDef", list.Empty, typeof<unit>, IsStaticMethod = true)
m.DefineStaticParameters(
[
ProvidedStaticParameter("script", typeof<string>)
],
fun nm [| :? string as operation |] ->
let results =
Regex.Matches(operation, "@([a-zA-Z_][a-zA-Z0-9_]*)") |> Seq.cast
|> Seq.map (fun (regmatch: Match) -> regmatch.Groups.[1].Captures.[0].ToString())
let ps = [ for a in results -> ProvidedParameter(a, typeof<string>) ] |> List.distinct
let opDef = ProvidedMethod(nm, ps, typeof<unit>, IsStaticMethod = true, InvokeCode = (fun _ -> <@@() @@>))
opDef.AddXmlDoc("Constructs a guarded method for the operation's script")
parameterizedType.AddMember(opDef)
opDef)
let schemaProp =
ProvidedProperty("Schema", typeof<string>, IsStatic = true,
GetterCode = (fun _ -> <@@ schema @@>))
let invariantsProp =
ProvidedProperty("Invariants", typeof<string>, IsStatic = true,
GetterCode = (fun _ -> <@@ invariants @@>))
parameterizedType.AddMember(m)
parameterizedType.AddMember(schemaProp)
parameterizedType.AddMember(invariantsProp)
parameterizedType
do
let root = ProvidedTypeDefinition(asm, ns, "Domain", None)
root.DefineStaticParameters(
[
ProvidedStaticParameter("schema", typeof<string>)
ProvidedStaticParameter("invariants", typeof<string>, "")
],
fun nm [| :? string as schema ; :? string as invariants |] ->
buildDomainProvider nm schema invariants)
this.AddNamespace(ns, [ root ])
[<assembly:TypeProviderAssembly>]
do()