Действительно сильно типизированные поставщики типов - PullRequest
0 голосов
/ 28 февраля 2012

Я не понимаю, как предоставлять строго типизированные типы через провайдера типов.Все примеры, которые я вижу, имеют одинаковый тип в результате, независимо от ввода.

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 Ответ

2 голосов
/ 28 февраля 2012

Да, легко предоставлять разные типы в зависимости от ввода. В качестве очень простого примера вы можете сделать что-то вроде:

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 static.

...