Tworzenie wystąpienia typu Generic <T> ze zmienną zawierającą Type

85

Czy można uzyskać następujący kod? Wiem, że to nie działa, ale zastanawiam się, czy istnieje obejście?

Type k = typeof(double);
List<k> lst = new List<k>();
Chris
źródło
Nieco zdezorientowany komentarzem „można to osiągnąć w C # 4.0”. Nie może, a przynajmniej nie w sposób, w jaki to okazujesz. C # 4 nadal wymaga określenia parametrów typu ogólnego w czasie kompilacji; nadal nie możesz przekazać zmiennej Type jako parametru typu ogólnego.
itowlson
1
Jeśli jest to pytanie, proszę sformułować pewne pytania jako pytania. Podanego kodu nie można wykonać w języku C # 4.0.
Lasse V. Karlsen
1
Podobne pytanie: stackoverflow.com/questions/687363/ ...
Zach Johnson
Przepraszam za rzecz C # 4.0. Chodziło mi o to, że odpowiedź może wykorzystywać koncepcje w C # 4.0, niekoniecznie, że kod będzie działał w C # 4.0. Dzięki za edycję DrJokepu.
Chris,
12
Myślę, że to pytanie zostało sformułowane idealnie - odpowiednia ilość szczegółów!
RunHolt

Odpowiedzi:

119

Tak jest:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);
David M.
źródło
Myślę, że tego właśnie chcę. Pozwól, że sprawdzę dwukrotnie, a za chwilę zaznaczę Twoją odpowiedź.
Chris
3
Myślę, że głównym problemem jest to, że nie opisują, co chcesz nas . Pokażesz nam nieudana próba czegoś , a potem pyta, jak osiągnąć to, co chcesz . Jeśli chcesz odpowiedzi, a nie domysłów, powinieneś opisać, co musisz zrobić, zamiast tego, jak próbowałeś to zrobić.
Lasse V. Karlsen
Zasadniczo chcę utworzyć List <>, w którym typ jest określony jako zmienna typu.
Chris,
3
Dzięki David M, twój kod robi dokładnie to, czego potrzebowałem. Przepraszam tych, którzy nie mogli odpowiedzieć, ponieważ nie udzieliłem odpowiedniego pytania.
Chris,
czy można zrobić to samo w przypadku metod ogólnych? muszę przekazać typ dynamiczny dla metody, opublikowałem mój problem na poniższym linku stackoverflow.com/questions/4101784/ ...
Mathiyazhagan
3

Czystszym sposobem może być użycie metody ogólnej. Zrób coś takiego:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}
Bryan Legend
źródło
Nie jestem pewien, co masz na myśli przez „indeksy”, czy to zmienna zadeklarowana gdzie indziej?
jrh