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.
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:
staticvoidAddType<T>()where T : DataObject
{
Indexes.Add(typeof(T), new Dictionary<int, T>());
}
Odpowiedzi:
Tak jest:
var genericListType = typeof(List<>); var specificListType = genericListType.MakeGenericType(typeof(double)); var list = Activator.CreateInstance(specificListType);
źródło
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>()); }
źródło