如何获取 TypeReference 的通用参数?

How to get the generic arguments of a TypeReference?

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 属性,但这仅适用于参数尚未映射到参数的顶层 TypeDefinitions。在上面的类型上使用它会 return 一个空集合。

这能以某种方式完成吗?

顺便说一句,这是我用来获取上述类型的 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

Mono.Cecil 中的类型专门化是通过子类化实现的。

TypeReference type = ...;
if (type.IsGenericInstance) {
    GenericInstanceType instance = (GenericInstanceType) type;
    IList<TypeReference> genericArguments = instance.GenericArguments;
}