2009-08-31 15 views
14

Nie sądzę, że można to zrobić w języku C#, ale publikując to tylko, aby się upewnić. Oto mój problem. Chciałbym zrobić coś takiego w C#:Typy ogólne z parametrem typu w C#

var x = 10; 
var l = new List<typeof(x)>(); 

lub

var x = 10; 
var t = typeof(x); 
var l = new List<t>(); 

Ale oczywiście to nie działa. Chociaż nie powinno to stanowić problemu, ponieważ typ t jest rozwiązywany podczas kompilacji. Rozumiem, że można to rozwiązać za pomocą refleksji, ale ponieważ typy są znane w czasie kompilacji, użycie refleksji byłoby przesadą.

+0

wynosi x zawsze będzie 10 czy też jest to tylko dowód pojęcie? Zastanawiam się, czy można uniknąć użycia słowa kluczowego var. –

+0

To tylko dowód koncepcji. Próbowałem użyć tego rodzaju kodu dla Func <> i Expression <>, aby pozbyć się nadmiarowego pisania. Tak więc typ można jawnie zadeklarować:

 int x = 10; var l = new List(); 
Max

Odpowiedz

41
public static List<T> CreateCompatibleList<T> (T t) 
{ 
    return new List<T>() ; 
} 

var x = 10 ; 
var l = CreateCompatibleList (x) ; 
+0

Niezły. Naprawdę podoba mi się to rozwiązanie. – Dykam

+1

+1 Sneaky i działa w tym przypadku. :) –

+0

Muy clevar! Ładnie wykonane. –

3

Definiowanie rodzajowych odbywa się podobnie jak w C#:

var someList = new List<int>(); 

Można nie określić rodzajowych tak:

var x = 1; 
var someType = typeof(x); 
var someList = new List<someType>(); 

bo jesteś określający typ w czasie wykonywania w tym przypadku , nie skompiluj czasu. C# nie obsługuje tego.

+4

Właśnie powtórzyłeś to, co Max stwierdził w pytaniu. –

+1

@Anton Nie, nie zrobiłem, Max ma wrażenie, że typeof (x) jest rozwiązany w czasie kompilacji, co nie jest poprawne. – Joseph

+0

@Joseph: Jesteś pewien? Wiem, że x.GetType() jest rozwiązywany w środowisku wykonawczym, ponieważ daje typ, do którego obecnie odwołuje się x, ale myślałem, że typeof (x) zawsze da typ zmiennej, zdefiniowanej w czasie kompilacji. –

6

Próbujesz uzyskać .Net, aby ustawić typ ogólny za pomocą operatora czasu pracy. Jak wiecie, to nie zadziała. Typy generyczne musi być ustawione w czasie kompilacji.

2

Nie można zrobić to dokładnie, jak prosisz, ale z odrobiną refleksji można osiągnąć to samo

Type genericType = typeof(List<>); 
Type[] type = new Type[] { typeof(int) }; 
Type instanceType = genericType.MakeGenericType(type); 
object instance = Activator.CreateInstance(instanceType); 
var l = (List<int>)instance; 
+2

'(Lista )' w ostatniej linii pokonuje twój cel. Ale tak, jest to przydatne w niektórych przypadkach. –

Powiązane problemy