【问题标题】:Get generic parameters from a ByReferenceType with Mono.Cecil使用 Mono.Cecil 从 ByReferenceType 获取泛型参数
【发布时间】:2012-06-06 16:56:34
【问题描述】:

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

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

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

System.Action`1

不知何故,它失去了泛型参数,不再是 GenericInstanceType。

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

【问题讨论】:

  • 我有理由确定这是用于表示通用方法的符号......
  • 是的,它是一种接受一个泛型参数的泛型方法 - 但它不提供有关泛型参数类型的信息。
  • GenericInstanceType 会产生一个全名,例如 System.Action`1,而 GenericParameters 成员中的第一个 TypeReference 对象将是 System.String 的对象。

标签: c# .net cil il mono.cecil


【解决方案1】:

您可以使用它深入了解 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 的原始元素类型。

【讨论】:

  • 我试过类似的东西,但没有运气: (GenericInstanceType)(parameter.ParameterType.GetElementType()) => "Cannot cast 'parameter.ParameterType.GetElementType()' (它有一个实际的'Mono.Cecil.TypeReference' 的类型)到 'Mono.Cecil.GenericInstanceType'"
  • @aethoric:这不是类似的东西。使用 ElementType 属性,而不是 GetElementType 方法。诚然,这里的命名可能会更好,但 ElementType 返回类型链中的直接前任,而 GetElementType 返回根类型。
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多