Fournisseurs de types vraiment fortement dactylographiés
-
13-11-2019 - |
Question
Je ne comprends pas comment fournir des types fortement dactylographiés via le fournisseur de type. Tous les exemples que je vois ont le même type, indépendamment de l'entrée.
MINICSVTYPEPROVIDER ne fournit que le double. RegexTypeProvider ne fournit que des correspondances.
Est-il possible de fournir des propriétés de différents Types en fonction Sur un paramètre fourni au fournisseur de type?
if somevariable then
proptype = typeof<int>
else
proptype = typeof<string>
let staticProp = ProvidedProperty(propertyName = "property",
propertyType = propType,
GetterCode= (fun [arg] -> <@@ %%arg :?> propType @@>))
La solution
Oui, il est facile de fournir différents types en fonction de l'entrée. À titre d'exemple très simple, vous pouvez faire quelque chose comme:
let propType, propValue =
if somevariable then
typeof<int>, <@@ 1 @@>
else
typeof<string>, <@@ "test" @@>
let prop = ProvidedProperty("property", propType, GetterCode = fun [_] -> propValue)
Pour étendre cela dans le sens que vous suggérez, vous pouvez définir l'intégralité du Getter dans le conditionnel:
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)
Cependant, notez que vous devez ensuite vous assurer que la représentation sur laquelle vous appelez la propriété est un int
ou string
respectivement. Notez également que contrairement à la dénomination choisie (staticProp
), ce ne sont pas des propriétés statiques, car vous passez un récepteur (arg
) au Getter et n'a pas marqué le ProvidedProperty
statique.