2011-08-25 7 views

답변

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

유효한 F #인지는 모르겠지만 예상 한 내용과 충분히 유사합니다. +1 lol –

+3

Nice. 입력 값을 _x에 바인딩하는 대신 드롭 할 수도 있습니다. 'getStaticType (_ : 'T) = typeof <'T>'하자. – cfern

+0

감사합니다. 그게 내가 필요한거야! –

1

,하지만 당신은과 유형을 검색 할 견적을 사용할 수 있습니다 :이 작동하지 않습니다. 예를 들어

:

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

그리고 시험 :

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

브라이언에 의해 솔루션은 아마 당신이 필요하지 않습니다,하지만 당신은 실제로 그것을 필요가 없습니다.

런타임 타입 - 당신이 정말로 유형이되었다 즉 직렬화 해제 (정적 형식이 시사하는 것보다 더 구체적으로 수 있기 때문에 그것은 아마 (GetType를 사용하여) 런타임시 값의 유형을 감지해야하는 경우 또는 Reflection을 사용하여 만들고 obj 또는 일부 인터페이스 유형의 값을가집니다. 당신은 그냥 정적으로 알려진 형식의 System.Type을 알고 싶다면는, 당신은해야 -

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

정적 유형 :이 경우에는 getStaticType 항상 당신에게 obj을 줄 것이기 때문에, 명시 적으로 null을 처리해야 typeof<_>을 사용하여 필요한 모든 것을 작성할 수 있습니다. 귀하의 예를 들어 당신이 값의 유형은 string 것을 확신 할 수 있기 때문에 당신은 브라이언의 솔루션을 사용할 수 있도록, 당신이 정말로, 동적 행동을하지 않아도에서

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

: 당신이 일반적인 기능이있을 때 유용합니다 , 그러나 typeof<string>을 사용하는 것도 괜찮을 것입니다.

관련 문제