2017-07-28 6 views
1

F#では、文字列の配列System.Typeを作成したい場合は、typeof<string[]>と書くだけで済みます。これは、コンパイル時にtypeofの型を指定できるからです。型の識別された共用体表現から配列のシステム型への移動方法は?

type Ty = 
| Int32 
| Float32 
| String 
| Array of Ty 

let to_dotnet_type: Ty -> System.Type = ... 

しかし、私はコンパイル時に不明なを探しています正確なSystem.Typeは、どのように私は、.NET System.TypeTyから行くように、私は労働組合の種類を持っていたと仮定しますか?特に配列には一般的なパラメータがありませんので、F#が基底から継承する新しい配列型を要求時にSystem.Arrayにインスタンス化していると推測しています。私はそれを動的に行う方法については空白を描いています。

私の内部表現とCLR型の間で動くことができる理由は、F#(F#で)にコンパイルしてGetMethodのような配列を持つ言語を使用しているためです。System.Type sを引数とします。私はそれを行うためのより良い方法の知識の欠如のためにinteropを行うためにそれらを使用しています。

答えて

2

あなたは配列型を構築するためにType.MakeArrayTypeを使用することができます。

let rec to_dotnet_type: Ty -> System.Type = function 
| Int32 -> typeof<Int32> 
| Float32 -> typeof<Single> 
| String -> typeof<String> 
| Array(elemTy) -> let et = to_dotnet_type(elemTy) in et.MakeArrayType() 
+0

私はそれの逆をどのように行うのでしょうか? 'System.Type'配列を取得し、その基になる型を取得するにはどうしたらいいですか? –

+0

'GetElementType'メソッドを使用します。それは私の質問に答えます。 –

関連する問題