Creazione di un'istanza di tipo Generic <T> con una variabile contenente Type


85

È possibile ottenere il seguente codice? So che non funziona, ma mi chiedo se esiste una soluzione alternativa?

Type k = typeof(double);
List<k> lst = new List<k>();

Un po 'confuso dal tuo commento "questo può essere realizzato in C # 4.0". Non può, almeno non nel modo in cui lo mostri. C # 4 richiede ancora parametri di tipo generico da specificare in fase di compilazione; non è ancora possibile passare una variabile di tipo come parametro di tipo generico.
itowlson

1
Si prega di formulare le cose come una domanda quando è una domanda. Il codice specificato non può essere eseguito con C # 4.0.
Lasse V. Karlsen


Mi dispiace per la cosa di C # 4.0. Volevo dire che la risposta poteva usare concetti in C # 4.0, non necessariamente che il codice avrebbe funzionato in C # 4.0. Grazie per la modifica DrJokepu.
Chris

12
Penso che questa domanda sia formulata perfettamente - la giusta quantità di dettagli!
RunHolt

Risposte:


119

Si C'è:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);

Penso che questo sia quello che voglio. Fammi ricontrollare e contrassegnerò la tua come risposta momentaneamente.
Chris

3
Credo che il problema principale è che non descrivere ciò che si vuole noi . Ci mostri un tentativo fallito in qualcosa e poi chiedi come ottenere ciò che desideri . Se vuoi risposte e non supposizioni, dovresti descrivere cosa devi fare, invece di come hai tentato di farlo.
Lasse V. Karlsen

Fondamentalmente voglio creare un List <> in cui il tipo è specificato come variabile Type.
Chris

3
Grazie David M, il tuo codice fa esattamente quello di cui avevo bisogno. Scusate chi non ha saputo rispondere perché non ho fornito una domanda adeguata.
Chris

è possibile fare lo stesso per i metodi generici? ho bisogno di passare il tipo dinamico per il metodo, ho postato il mio problema sul collegamento sotto stackoverflow.com/questions/4101784/...
Mathiyazhagan

3

Un modo più pulito potrebbe essere quello di utilizzare un metodo generico. Fai qualcosa di simile:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}

Non sono sicuro di cosa intendi per "indici", è una variabile dichiarata altrove?
jrh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.