2011-08-25 1 views

Répondre

5
let getStaticType<'T>(_x : 'T) = typeof<'T> 
let a : string = null 
let b : int[] = null 
let typ1 = getStaticType a 
let typ2 = getStaticType b 
printfn "%A %A" typ1 typ2 
// System.String System.Int32[] 
+0

Je ne sais pas si cela est valide F #, mais il semble assez proche de ce que je m'attendais à voir donc +1 lol –

+3

Nice. Vous pouvez également supprimer la valeur d'entrée au lieu de la lier à _x. 'let getStaticType (_: 'T) = type de <'T>'. – cfern

+0

Merci. C'est ce dont j'avais besoin! –

1

Je ne suis pas sûr que ce soit la meilleure solution, mais vous pouvez utiliser Citations pour récupérer le type avec.

Par exemple:

let get_type x = <@ x @>.Type.FullName 

Et test:

let a : string = null 
let a' = get_type a 

val a : string = null 
val a' : string = "System.String" 

let a : int[] = null 
let a' = get_type a 

val a : int [] = null 
val a' : string = "System.Int32[]" 
4

La solution par Brian fait probablement ce que vous avez besoin, mais vous ne devriez pas avoir besoin dans la pratique.

Type d'exécution - Si vous avez vraiment besoin de détecter le type de valeur lors de l'exécution (en utilisant GetType) alors il est probablement parce que le type peut être plus précis que ce type statique suggère (il a été désérialisé ou créé en utilisant Reflection et vous avez une valeur de type obj ou une interface). Dans ce cas, vous devez gérer null explicitement, parce que getStaticType vous donnera toujours obj:

let handleAtRuntime (value:obj) = 
    match value with 
    | null -> // handle null 
    | _ -> let typ = value.GetType() 
     // do something using runtime-type information 

type statique - Si vous avez juste besoin de connaître le System.Type d'un type statiquement connu, alors vous devriez être capable d'écrire tout ce dont vous avez besoin en utilisant typeof<_>. Ceci est utile lorsque vous avez des fonctions génériques:

let handleStatically (value:'T) = 
    let typ = typeof<'T> 
    // do something with the type (value still may be null) 

Dans votre exemple, vous avez vraiment pas besoin de comportement dynamique, parce que vous pouvez être sûr que le type de la valeur est string, vous pouvez utiliser la solution de Brian , mais en utilisant typeof<string> serait bien aussi.