Есть ли какие-либо пути от TypeReference в Mono.Cecil к типу?
Mono.Cecil TypeReference to Type?
Ответ 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 ответ для этого