Подтвердить что ты не робот

Mono.Cecil TypeReference to Type?

Есть ли какие-либо пути от TypeReference в Mono.Cecil к типу?

4b9b3361

Ответ 1

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

Чтобы перейти от TypeReference к System.Type, вам нужно будет вручную просмотреть его с помощью Reflection и AssemblyQualifiedName. Имейте в виду, что Cecil использует соглашения IL для выхода из вложенных классов и т.д., Поэтому вам нужно применить некоторую ручную коррекцию.

Если вы хотите разрешить не общие, не вложенные типы, вы должны быть в порядке.

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

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

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