如何获取TypeReference的泛型参数?

时间:2017-11-05 12:48:59

标签: .net reflection mono.cecil

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;

我正在尝试弄清楚如何获取上述GenericArguments类型的Mono.Cecil并且没有取得任何进展。使用标准反射API,我只需在GetGenericArguments上调用Type方法,但这里没有类似的东西。存在GenericParameters属性,但仅适用于其参数尚未映射到参数的顶级TypeDefinitions。在上面的类型上使用它将返回一个空集合。

这可以以某种方式完成吗?

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

答案 0 :(得分:1)

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

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