Mono.Cecil类型参考类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (107)

有没有办法从Mono.Cecil中的TypeReference转换为Type?

提问于
用户回答回答于

就“盒子里面的东西”而言,您只能用相反的方式使用ModuleDefinition.Import API。

要从a TypeReference到a,System.Type您需要使用Reflection和AssemblyQualifiedName。手动查找它。请注意,塞西尔使用IL约定来逃避嵌套类等,所以你需要应用一些手动更正。

如果你只想解决非泛型,非嵌套类型,你应该没问题。

从一个TypeReference到一个TypeDefition(如果这就是你的意思),你需要去TypeReference.Resolve();

请求的代码示例:

TypeReference tr = ... 
Type.GetType(tr.FullName + ", " + tr.Module.Assembly.FullName); 
// will look up in all assemnblies loaded into the current appDomain and fire the AppDomain.Resolve event if no Type could be found

这里解释了反射中使用的约定,因为Cecils约定会参考Cecil源代码。

用户回答回答于

对于泛型类型,你需要这样的东西:

    public static Type GetMonoType(this TypeReference type)
    {
        return Type.GetType(type.GetReflectionName(), true);
    }

    private static string GetReflectionName(this TypeReference type)
    {
        if (type.IsGenericInstance)
        {
            var genericInstance = (GenericInstanceType)type;
            return string.Format("{0}.{1}[{2}]", genericInstance.Namespace, type.Name, String.Join(",", genericInstance.GenericArguments.Select(p => p.GetReflectionName()).ToArray()));
        }
        return type.FullName;
    }

请注意,此代码不处理嵌套类型,请检查@JohannesRudolph的答案

所属标签

可能回答问题的人

  • Hanzo

    6 粉丝0 提问7 回答
  • Richel

    9 粉丝0 提问3 回答
  • 用户3845578

    杭州吱吱吱科技 · 站长 (已认证)

    1 粉丝0 提问2 回答
  • mariolu

    31 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券