2017-11-05 10 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를 사용하면 Type에서 GetGenericArguments 메서드를 호출 할 것이지만 여기서는 그런 것이 없습니다. 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; 
}