Mono.Cecil ТипСсылка на Тип? - PullRequest
       42

Mono.Cecil ТипСсылка на Тип?

19 голосов
/ 15 ноября 2010

Можно ли в любом случае перейти от TypeReference в Mono.Cecil к Type?

Ответы [ 2 ]

20 голосов
/ 15 ноября 2010

В терминах «что в коробке» вы можете использовать его только наоборот, используя ModuleDefinition.Import API.

Чтобы перейти от TypeReference к 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

Условные обозначения, используемые в Reflection, объясняются здесь , для условных обозначений Cecils обратитесь к исходному коду Cecil.

2 голосов
/ 29 июля 2014

Для универсальных типов вам нужно что-то вроде этого:

    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 для этого

...