开发者

Mono.Cecil TypeReference to Type?

开发者 https://www.devze.com 2023-01-25 07:56 出处:网络
Is there anyways to go from a TypeReferenc开发者_如何学Goe in Mono.Cecil to a Type?In terms of \"what\'s in the box\" you can only have it the other way round, using the ModuleDefinition.ImportAPI.

Is there anyways to go from a TypeReferenc开发者_如何学Goe in Mono.Cecil to a Type?


In terms of "what's in the box" you can only have it the other way round, using the ModuleDefinition.Import API.

To go from a TypeReference to a System.Type you will need to manually look it up using Reflection and the AssemblyQualifiedName. Be aware that Cecil uses IL conventions to escape nested classes etc, so you need to apply some manual correction.

If you only want to resolve non-generic, non-nested types you should be fine though.

To go from a TypeReference to a TypeDefition (if that's what you meant) you need to to TypeReference.Resolve();


Requested Code Sample:

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

The conventions used in Reflection are explained here, for Cecils conventions consult the Cecil Source Code.


For generic types you need something like this:

    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;
    }

Please note this code doesn't handle nested types, please check @JohannesRudolph answer for this

0

精彩评论

暂无评论...
验证码 换一张
取 消