Durante lo sviluppo di uno dei miei progetti, ho riscontrato un problema relativo ai tipi generici.Inizializzazione di una serie di raccolte generiche con ciascuna un argomento generico diverso
Il progetto richiede che scriva una classe che funga da sorgente di oggetti elenco. Supponiamo che ho avuto la seguente classe:
public class TablesProvider
{
private readonly List[] _tables;
public TablesProvider()
{
// initialize the tables var here....
}
public List<TItem> GetTable<TItem>()
{
return (List<TItem>)_tables.Single(x => x is List<TItem>);
}
}
Questa classe, ovviamente, non funziona, perché il tipo List
è un tipo generico e, pertanto, deve essere specificato gli argomenti generici.
così ho fatto un tipo astratto chiamato MyList
, che sarebbe derivato da una più specifica di tipo MyList<TItem>
al fine di sfuggire a questa esigenza, e curato il TablesProvider
un po '.
public class TablesProvider
{
private readonly MyList[] _tables;
public TablesProvider()
{
// initialize the tables var here....
}
public MyList<TItem> GetTable<TItem>()
{
return (MyList<TItem>)_tables.Single(x => x is MyList<TItem>);
}
}
public abstract class MyList
{
// ...
}
public class MyList<TItem> : MyList, IList<TItem>
{
private readonly List<TItem> _elements = new List<TItem>();
public TItem this[int index]
{
get { return _elements[index]; }
set { _elements[index] = value; }
}
// ...
}
Questo funziona abbastanza bene. C'è rimasto solo un problema. Supponiamo di avere 45 collezioni diverse, ciascuna definita con un argomento generico diverso. Quale sarebbe il modo migliore per inizializzare tutte queste raccolte? Non posso usare un ciclo for qui, dal momento che i parametri generici sono specificati al momento della compilazione e non in fase di esecuzione, e quindi una costruzione del genere non sarebbe possibile:
for (int i = 0; i < 45; i++)
_tables[i] = new MyList<GenericParameters[i]>();
Il mio obiettivo finale è quello di avere il lusso di solo fare qualcosa di simile ...
var table = _tablesProvider.GetTable<SomeClass>();
var element = table[3];
var propertyValue = element.SomeProperty;
... senza la necessità di lanciare la variabile element
al fine di accedere ai suoi membri tipiche specifiche.
È probabilmente opportuno menzionare che la quantità di oggetti elenco diversi è fissa a 45. Ciò non cambierà. In teoria, potevo inizializzare l'array riga per riga, o avere invece 45 proprietà o variabili. Entrambe queste opzioni, tuttavia, mi sembrano una soluzione piuttosto economica, ma accetterò una di queste se non c'è altro modo.
Qualcuno di voi ha qualche idea? Sto sbagliando tutto questo? Dovrei prendere in considerazione un'altra struttura?
Grazie in anticipo.
Il Il punto è evitare di scrivere le 45 righe di codice. Non penso che sia quello che sta cercando. – Tweety
@Tweety Forse, ma come potrebbe popolare il suo ipotetico array 'GenericParameters []' in primo luogo senza 45 righe di _qualcosa_ (che si tratti di codice, un file di configurazione, ecc.)? Il suo design dichiarato implica avere 45 linee di qualcosa da qualche parte. È solo una questione di dove sono e come sono. – JLRishe