returns remarks example c# mono mono.cecil

example - remarks c# documentation



Tipo de Mono.CecilReferencia al Tipo? (2)

¿Hay alguna forma de pasar de una TypeReference en Mono.Cecil a un Type?


Para los tipos genéricos necesitas algo como esto:

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

Tenga en cuenta que este código no admite tipos anidados, verifique la respuesta de @JohannesRudolph


En términos de "lo que hay en la caja", solo puede tenerlo al revés, utilizando la ModuleDefinition.Import API.

Para pasar de una TypeReference a un System.Type , deberá buscarlo manualmente utilizando Reflection y el AssemblyQualifiedName . Tenga en cuenta que Cecil usa las convenciones de IL para escapar de las clases anidadas, etc., por lo que debe aplicar alguna corrección manual.

Si solo quiere resolver tipos no genéricos, no anidados, debería estar bien.

Para pasar de una TypeReference a una TypeDefition (si eso es lo que quiso decir), debe TypeReference.Resolve();

Ejemplo de código solicitado:

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

Las convenciones utilizadas en Reflexión se explican here ; para las convenciones de Cecils, consulte el Código fuente de Cecil.