2010-11-15 12 views

risposta

20

In termini di "cosa c'è nella scatola" è possibile averlo solo al contrario, usando l'API ModuleDefinition.Import.

Per passare da un TypeReference a un System.Type, è necessario verificarlo manualmente utilizzando Reflection e lo AssemblyQualifiedName. Tieni presente che Cecil utilizza le convenzioni di IL per sfuggire alle classi annidate, quindi è necessario applicare alcune correzioni manuali.

Se si desidera risolvere solo tipi non generici e non nidificati, si dovrebbe comunque andare bene.

di passare da un TypeReference ad un TypeDefition (se è quello che volevi dire) è necessario per TypeReference.Resolve();


richiesto Esempio di codice:

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 

Le convenzioni usate in riflessione sono spiegati here , per le convenzioni Cecil consultare il codice sorgente Cecil.

+0

Si noti inoltre che non è costruito Mono.Cecil over System.Reflection (essendo una libreria indipendente), ciò significa che non esiste un modo diretto per convertirli l'un l'altro. Dovresti comunque essere in grado di farlo, ma non sarà bello. – ShdNx

+0

Quindi, come con la riflessione dovrei cercare il tipo? E hai un esempio di un tipo annidato a riflessione e un tipo annidato a cecile? – Will

+7

Invece di aggiungere manualmente ",", è possibile utilizzare Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName). Il codice fornito da – user276648

2

Per i tipi generici avete bisogno di qualcosa di simile:

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

Si prega di notare questo codice non gestisce i tipi nidificati, si prega di controllare @JohannesRudolph risposta per questo

Problemi correlati