使用 Mono.Cecil 从 ByReferenceType 获取泛型参数

本文关键字:获取 泛型 参数 ByReferenceType Mono Cecil 使用 | 更新日期: 2023-09-27 17:56:27

我有一个获取参数的方法,例如:

public void Foo(ref Action<string> bar);

使用 Cecil 枚举参数会生成 ByReferenceType。调用 GetElementType() 以尝试取消引用参数会返回一个全名的 TypeReference:

System.Action`1

不知何故,它丢失了泛型参数,不再是泛型实例类型。

如何正确取消引用 byref 参数,并获取实际的通用实例类型?

使用 Mono.Cecil 从 ByReferenceType 获取泛型参数

您可以使用以下内容深入了解 TypeSpec(当然,当您知道自己在追求什么时,您可以缩短它):

ParameterDefinition parameter = ...;
ByReferenceType byref = (ByReferenceType) parameter.ParameterType;
GenericInstanceType action_string = (GenericInstanceType) byref.ElementType;
TypeReference action = action_string.ElementType;
TypeReference str = action_string.GenericArguments [0];

方法返回从中构造类型规范的原始元素类型。