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>();

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


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);

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>());
}

Nie jestem pewien, co masz na myśli przez „indeksy”, czy to zmienna zadeklarowana gdzie indziej?
jrh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.