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
答案 0 :(得分:1)
Mono.Cecil中的类型特化是通过子类化实现的。
TypeReference type = ...;
if (type.IsGenericInstance) {
GenericInstanceType instance = (GenericInstanceType) type;
IList<TypeReference> genericArguments = instance.GenericArguments;
}