Je ne pense pas que ce soit aussi simple que cela (rappelez-vous que je suis f # naïf) envisager le scénario follwoing où
1) nous utilisons des génériques sur plusieurs types 2) nous n'avons pas les informations de type pour un objet, donc il arrive dans une fonction comme type obj, comme dans certaines des bibliothèques .NET datacontract/serialization
que nous avons retravaillé ma proposition d'utiliser la réflexion:
type SomeType<'A> = {
item : 'A
}
type AnotherType<'A> = {
someList : 'A list
}
let test() =
let getIt() : obj =
let results : SomeType<AnotherType<int>> = { item = { someList = [1;2;3] }}
upcast results
let doSomething (results : obj) =
let resultsType = results.GetType()
if resultsType.GetGenericTypeDefinition() = typedefof<SomeType<_>> then
let method = resultsType.GetMethod("get_item")
if method <> null then
let arr = method.Invoke(results, [||])
if arr.GetType().GetGenericTypeDefinition() = typedefof<AnotherType<_>> then
printfn "match"
getIt() |> doSomething
On dirait qu'il devrait y avoir beaucoup plus naturel de le faire ...
Hmmm, vérification du type d'exécution? Savez-vous quels types retourne votre méthode? Si oui, peut-être vous pouvez envelopper le type dans une union de type-safe et utiliser la correspondance de modèle à la place, peut-être vos types dans cette fonction peuvent exposer une interface commune? Il y a beaucoup de choses que vous pouvez faire pour éviter une vérification de type à l'exécution. – Juliet
Que faire si vous ne savez pas ce que les types retournent sont? Voir mon post ci-dessous AS T1> est différent thean T1 > et si vous vous souciez seulement de l'objet étant de T1 indépendamment des autres spécificités? –
akaphenom