2013-04-24 15 views
6

Uso Mono.Cecil posso scorrere i campi su System.Collections.Generic.List (_items, _size, _version, ecc), se cerco di usarle ottengo sempre l'eccezioneproprietà Accesso su System.Collections.Generic.List

Stati 'T [] System.Collections.Generic.List`1 :: _ elementi' viene dichiarato in un altro modulo e deve essere importato

ho due domande per quanto riguarda questo:

  1. Non è possibile accedere ai campi sottostanti dei generici?
  2. Se è possibile, quale sarebbe la dichiarazione di importazione per questo?

Sono riuscito ad accedere ai membri privati ​​sugli oggetti (purché non siano generati dal compilatore), quindi presumo che (1) sia ok. Ho anche importato con successo le cose, anche se ammetto che la mia comprensione di come funziona l'importazione è traballante (alias "se dà un errore, prova a importarlo").

+0

Potresti fornire un esempio breve ma completo che fallisce? E puoi riprodurlo con una semplice riflessione piuttosto che con Cecil? (Questo renderebbe più semplice la riproduzione da parte degli altri.) –

+0

Non proprio quello che hai chiesto, ma ho creato un ramo sul mio progetto che puoi usare per riproporlo tramite 'git clone -b list_import --single-branch git @ github.com: JesseBuesking/BB.DeepCopy.git'. Esegui uno qualsiasi dei test per il sistema da tessere (i test falliranno da questo, quindi sarai in grado di vedere l'errore nell'output di test). Cercherò di riproporlo usando la riflessione oggi. – JesseBuesking

+0

Follow up: è possibile impostare un breakpoint sulla linea 941 in 'ModuleWeaver.cs'. Passare il codice da lì ti porterà attraverso il processo di tentare di accedere ai campi sull'oggetto elenco. – JesseBuesking

risposta

3

È necessario importare FieldDefinition in ModuleDefinition prima di scrivere IL che punta ad esso.

Quindi dopo aver visto il tuo codice sarebbe qualcosa di simile.

var fieldReference = ModuleDefinition.Import(field); 
Action<Collection<Instruction>> load = collection => collection.AddI(OpCodes.Ldfld, fieldReference); 

Ho anche notato che hai un altro bug. Nel momento in cui ti trovi nel codice sopra hai perso il contesto degli argomenti di tipo. Quindi stai cercando di chiamare qualcosa su List<T> invece di qualcosa come List<MyClass>. Ma puoi sollevare un'altra domanda SO se non riesci a risolverlo :)

+0

Il problema principale era che la mia estensione 'AddI' non aveva il supporto per prendere' FieldReferences'. Ho continuato a risolvere il 'FieldReference' per ottenere un' TypeDefinition' in modo che potessi passarlo, il che non è giusto. Doh! Ho anche pubblicato una domanda riguardante il problema degli argomenti di tipo che hai indicato nel mio codice all'indirizzo http://stackoverflow.com/q/16329710/435460. – JesseBuesking

Problemi correlati