Esiste comunque un passaggio di tipo da Mono.Cecil a un tipo?Tipo Mono.CecilRiferimento di tipo?
risposta
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.
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
- 1. tipo desiderato NSNumero tipo di tipo __NSCFString error
- 2. Tipo Scala di tipo e tipo this.type in collezioni
- 3. capire un Tipo Tipo di Sinonimo
- 4. Sistema di tipo Python - Oggetto vs tipo
- 5. tipo ocaml all'interno di un tipo
- 6. tipo di firma con il tipo privato
- 7. Che tipo di tipo Java è "[B"?
- 8. Parametri di tipo multiplo in classe tipo?
- 9. Tipo di inferenza sul metodo restituito tipo
- 10. Tipo di trasmissione utilizzando il parametro tipo
- 11. Tipo costruttore come ritorno Tipo
- 12. Tipo-Inferenza Scala Tipo Costruttore
- 13. elenco delle interfacce vs. Elenco di tipo derivato - Impossibile convertire Espressione Tipo di ritorno Tipo di
- 14. Dedurre tipo di modello di tipo in C++
- 15. Symfony 3 - Impossibile caricare il modulo di tipo di tipo
- 16. Variante di tipo Java, consumer di tipo generico
- 17. Java - Overriding Tipo oggetto di parametro di cemento Tipo
- 18. Checker di tipo Python di IntelliJ-IDEA - tipo atteso errato?
- 19. tipo di inferenza basata sul tipo di argomento generico (Delphi)
- 20. Vincoli di tipo su tutte le istanze di tipo famiglia
- 21. tipo di data non è un tipo di sistema definito
- 22. cast tipo generico di interfacciarsi tipo di vincolo
- 23. Forza un parametro di tipo generico come tipo di classe?
- 24. Unificare tipo e non di tipo parametri di modello
- 25. Tipo di annuncio SQL di tipo Float to String (Excel)
- 26. Valori di tipo "tipo oggetto" dell'archivio CF di Entity Framework?
- 27. Tipo di parametro funzione override con tipo di classe derivata
- 28. Un tipo può essere un tipo di riferimento e un tipo di valore allo stesso tempo?
- 29. Come definire un tipo di tipo superiore di tipo esistenziale in Scala
- 30. F # - Tipo ampliamento VS Tipo estensione
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
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
Invece di aggiungere manualmente ",", è possibile utilizzare Assembly.CreateQualifiedName (tr.Module.Assembly.FullName, tr.FullName). Il codice fornito da – user276648