Y at-il de toute façon passer d'un TypeReference en Mono.Cecil à un Type?Mono.Cecil TypeRéférence à taper?
Répondre
En termes de "ce qui est dans la boîte" vous ne pouvez l'avoir qu'à l'envers, en utilisant l'API ModuleDefinition.Import
.
Pour passer d'un TypeReference
à un System.Type
, vous devrez le rechercher manuellement à l'aide de Reflection et de AssemblyQualifiedName
. Sachez que Cecil utilise les conventions IL pour échapper les classes imbriquées, etc., vous devez donc appliquer une correction manuelle.
Si vous souhaitez uniquement résoudre des types non génériques et non imbriqués, cela ne pose aucun problème.
Pour passer d'un TypeReference
à un TypeDefition
(si c'est ce que vous vouliez dire), vous devez d'TypeReference.Resolve();
code demandé Exemple:
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
Les conventions utilisées dans la réflexion sont expliqués here , pour les conventions de Cecil, consulter le code source de Cecil.
Pour les types génériques dont vous avez besoin quelque chose comme ceci:
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;
}
S'il vous plaît noter ce code ne gère pas les types imbriqués, s'il vous plaît vérifier @JohannesRudolph réponse à cette
Notez également que Mono.Cecil est pas construit sur System.Reflection (étant une bibliothèque indépendante), cela signifie qu'il n'y a pas de moyen direct de les convertir les uns aux autres. Vous devriez toujours être capable de le faire, mais ça ne sera pas joli. – ShdNx
Alors, comment avec la réflexion je chercherais le type? Et avez-vous un exemple d'un type imbriqué de réflexion et d'un type imbriqué cecil? – Will
Au lieu d'ajouter manuellement ",", vous pouvez utiliser Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName). – user276648