2017-11-05 9 views
0
val it : TypeReference = 
    System.Func`2<System.Object,TResult> 
    {ContainsGenericParameter = true; 
    DeclaringType = null; 
    ElementType = System.Func`2; 
    FullName = "System.Func`2<System.Object,TResult>"; 
    GenericArguments = seq [System.Object; TResult]; 
    GenericParameters = seq []; 
    HasGenericArguments = true; 
    HasGenericParameters = false; 

私は上記Mono.CecilタイプのGenericArgumentsを取得する方法を理解しようとしており、何も進んでいません。標準リフレクションAPIを使用して、私はTypeGetGenericArgumentsメソッドを呼び出しますが、ここにはそのようなものはありません。存在するのはGenericParametersですが、パラメータが引数にマップされていない最上位レベルでのみ動作します。上記の型でそれを使用すると、空のコレクションが返されます。TypeReferenceの汎用引数を取得するにはどうすればよいですか?

これは何とかできますか?

ところで、私は上記のタイプを取得するために使用しているF#スクリプトです。私の質問は、その特定のタイプに特化しているわけではありません。

#load "load-references-release.fsx" 

open Mono.Cecil 
open Mono.Cecil.Rocks 

let mscorlib_path = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll" 
let mscorlib = AssemblyDefinition.ReadAssembly(mscorlib_path).MainModule 

let task = mscorlib.Types |> Seq.find (fun x -> x.Name = "Task`1") 

let task_cons = task.GetConstructors() 

let con = 
    task_cons 
    |> Seq.toArray 
    |> fun x -> x.[8] 

con.Parameters.[0].ParameterType 

答えて

1

Mono.Cecilの型の特殊化は、サブクラス化によって実現されます。

TypeReference type = ...; 
if (type.IsGenericInstance) { 
    GenericInstanceType instance = (GenericInstanceType) type; 
    IList<TypeReference> genericArguments = instance.GenericArguments; 
} 
関連する問題