J'essaie de motiver le match contre quelques types que je me soucie de la génération SQL. Idéalement, j'aimerais faire ceci:
let rec getSafeValue record (prop: PropertyInfo) = match prop.GetValue(record, null) with | :? string as str -> "'" + str + "'" | :? Option<_> as opt -> match opt with | Some v -> getSafeValue v prop | None -> "null" | _ as v -> v.ToString()
4 Réponses :
Cela ne peut pas fonctionner dans F # sans covariance. En supposant que vous êtes heureux pour v code> de type
obj code>, vous souhaitez pouvoir traiter l'option
option
option
option
Juste pour être clair, .NET (et donc f #) n'a pas vraiment de covariance.
@Ganeshsittampalam - .NET (à partir de 4.0) fait i> a la covariance: msdn.microsoft.com/en-us/library/dd799517.aspx . Je pense que la raison pour laquelle il n'a pas été implémenté dans F # 2.0 est parce que F # ciblait principalement .NET 2.0 au moment de la sortie.
Lorsque je mettez votre code dans F # Interactive, il semble que "enregistrer" un paramique générique. Peut-être que cela fonctionne différemment dans le compilateur normal. De toute façon, il s'agit probablement de type Je suis désolé je suis désolé Je ne peux pas tester cela maintenant, mais donnez-lui un coup de feu. La fonction code> box code> utilise un paramique générique, de sorte que cela puisse faire le tour. P> obj code> en raison du premier argument de
getvalue code> étant de type
obj code>.
même accord - il contraint à la fois enregistrer et opter pour taper 'A
Certains V -> GetsAfevalue V SUP ne fonctionnera que si V est du même type que l'enregistrement. (ou découlant de ce type) sinon la première ligne échouera. Vous ne pouvez pas dire PROP.GETVALUE (ENREGISTREMENT, NULL) À moins que la propriété indiquée par PROP a du sens (AKA fait partie du type) dans le contexte du premier argument.
Si c'est le même type que vous puissiez faire: p> mais si le type de V est dérivé de 'A, il correspondra au dernier cas afin que ce qui précède, il aura besoin d'avoir exactement le même type p> p>
Non, il n'y a pas de bon moyen de le faire en utilisant des constructions intégrées de F #. Cependant, vous pouvez construire votre propre modèle actif réutilisable pour ce genre de chose:
let rec getSafeValue (item:obj) = match item with | :? string as str -> "'" + str + "'" | UC <@ Some @> [v] -> getSafeValue v | UC <@ None @> [] -> "null" | _ as v -> v.ToString()
C'est une façon née de le faire. J'ai fini par faire quelque chose de similaire.