2012-02-28 14 views
0

強く型付けされた型を型プロバイダで提供する方法はありません。 私が見ているすべての例は、入力とは無関係に結果と同じタイプです。本当に強く型付けされた型のプロバイダ

MiniCsvTypeProviderは、double型のみを提供します。 RegexTypeProviderはマッチのみを提供します。

は、タイププロバイダに供給されたパラメータにをによって異なるタイプの特性を提供することが可能ですか?

if somevariable then 
     proptype = typeof<int> 
    else 
     proptype = typeof<string> 

    let staticProp = ProvidedProperty(propertyName = "property", 
             propertyType = propType, 
             GetterCode= (fun [arg] -> <@@ %%arg :?> propType @@>)) 
+0

または多分私は、ユニオンタイプを動的に作成する必要があり、すべてのアイテムに対して1つを作成する必要があります。それほど簡単ではありません。 – nicolas

+0

ランタイム '動的キャスト' – nicolas

+0

を実行しなければならないと思います(これはすべてステージングされたランタイムで実行されます) – nicolas

答えて

2

はい、入力に応じて異なるタイプを提供するのは簡単です。非常に単純な例として、あなたのような何かができる:あなたが示唆している線に沿ってこれを展開するには

let propType, propValue = 
    if somevariable then 
     typeof<int>, <@@ 1 @@> 
    else 
     typeof<string>, <@@ "test" @@> 

let prop = ProvidedProperty("property", propType, GetterCode = fun [_] -> propValue) 

、あなたは条件付きで全体のゲッターを定義することができます。

let propType, propGetter = 
    if somevariable then 
     typeof<int>, fun [arg] -> <@@ %%arg : int @@> 
    else 
     typeof<string>, fun [arg] -> <@@ %%arg : string @@> 

let prop = ProvidedProperty("property", propType, GetterCode = fun [_] -> propValue) 

しかし、ノートプロパティを呼び出す表現がそれぞれintまたはstringであることを確認する必要があります。また、選択した名前(staticProp)とは対照的に、受信者(arg)をゲッターに渡しており、ProvidedPropertyを静的に設定していないため、これらは静的プロパティではありません。

+0

ありがとうございました。私はこれを実際にテストする必要があります。 – nicolas

関連する問題