Domanda

Domanda :
Esiste un modo statico per determinare in modo affidabile il tipo contenuto da un tipo derivato da CollectionBase, utilizzando Reflection o Microsoft.Cci?

Sfondo :
Sto lavorando a un generatore di codice che copia i tipi, crea versioni personalizzate di quei tipi e converte tra. Esamina i tipi nell'assembly di origine tramite Microsoft.Cci. Stampa il codice sorgente utilizzando modelli testuali. Esegue molte conversioni e personalizzazioni e rilascia codice che non mi interessa.

Nel codice risultante, intendo sostituire List<T> ovunque sia stato precedentemente utilizzato un CollectionBase, IEnumerable<T> o T[]. Voglio usare List<T> perché sono abbastanza sicuro di poterlo serializzare senza lavoro extra, il che è importante per la mia applicazione. T è concreto in ogni caso. Sto cercando di non copiare le classi CollectionBase perché dovrei copiare l'implementazione personalizzata e vorrei evitare di doverlo fare nel mio generatore di codice.

L'unica parte con cui ho un problema è determinare T per List<T> quando si sostituisce un CollectionBase personalizzato.

Cosa ho fatto finora :
Ho esaminato brevemente i documenti e gli esempi MSDN per CollectionBase e menzionano la creazione di un metodo Add personalizzato sul tipo derivato. Non penso che questo sia in alcun modo imposto, quindi non sono sicuro di poter fare affidamento su questo. Un implementatore potrebbe chiamarlo qualcos'altro, o peggio, avere una raccolta che supporta più tipi, con Object come unico antenato comune.

Alternative che ho considerato :
Forse la serializzazione predefinita fa alcuni trucchi che posso sfruttare. Esiste una serializzazione predefinita per le raccolte CollectionBase o generalmente è necessario implementarla da soli? Se devi farlo da solo, ci sono alcuni metadati affidabili che potrei esaminare per determinare i tipi? Se supporta la serializzazione predefinita, si basa sui tipi di runtime degli elementi nella raccolta?

Potrei creare una mappatura nel mio generatore di codice dei tipi CollectionBase noti, mappati al corrispondente T per List<T>. Se un determinato tipo di CollectionBase che ho incontrato non è nell'elenco, genera un'eccezione. Questo è probabilmente ciò con cui andrò se non ho un'alternativa affidabile.

È stato utile?

Soluzione

Non sono ancora abbastanza sicuro di quello che vuoi fare per dare consigli.Tuttavia, le classi derivate da CollectionBase implementano tutte Add (T)?In tal caso, potresti cercare un metodo Add con un singolo parametro di tipo diverso da object e utilizzare quel tipo per T.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top