真正强类型的提供商

时间:2012-02-28 09:28:07

标签: f# strong-typing type-providers

我不知道如何通过类型提供程序提供强类型类型。 我看到的所有例子都与结果具有相同的类型,与输入无关。

MiniCsvTypeProvider仅提供双倍。 RegexTypeProvider仅提供匹配。

是否可以在提供给类型提供程序的参数上提供不同类型的属性

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

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

1 个答案:

答案 0 :(得分:2)

是的,根据输入提供不同的类型很容易。作为一个非常简单的例子,您可以执行以下操作:

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

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

要按照您建议的方式展开,您可以在条件中定义整个getter:

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)

但是,请注意,您需要确保您调用属性的表示形式分别为intstring。另请注意,与您选择的命名(staticProp)相比,这些不是静态属性,因为您将接收器(arg)传递给getter并且未标记{{1} }静态。