c# - 使用 Mono.Cecil 从 ByReferenceType 获取通用参数

标签 c# .net cil il mono.cecil

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

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

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

System.Action`1

它以某种方式丢失了通用参数,不再是 GenericInstanceType。

我怎样才能正确取消对 byref 参数的引用,并获得实际的通用实例类型?

最佳答案

您可以使用它深入研究 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];

GetElementType 方法返回构造 TypeSpec 的原始元素类型。

关于c# - 使用 Mono.Cecil 从 ByReferenceType 获取通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016392/

相关文章:

c# - 在一个类的所有方法之前运行一个方法

c# - 无法将源类型转换为目标类型

.net - 什么导致错误 HRESULT : 0x80010105 (RPC_E_SERVERFAULT)?

.net - Serilog Sinks Redis 是否支持 netcore 1.x?

c# - 处理 AssemblyResolve 事件后仍然出现 FileNotFound 异常

c# - 属性 'Id'是对象关键信息的一部分,不可修改

c# - 在 C# 中重载++ 和 -- 运算符

c# - 为什么局部函数生成的 IL 不同于匿名方法和 Lambda 表达式?

.net - 如果 CIL 仅基于堆栈,为什么它支持实例

C# IL 代码修改 - 保持堆栈完整