如何获取 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;
}
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;
}