2009-08-31 5 views
14

Je ne pense pas que cela puisse être fait en C#, mais en publiant cela juste pour être sûr. Voici mon problème. Je voudrais faire quelque chose comme ça en C#:Types génériques avec paramètre de type en C#

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

ou

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

Mais bien sûr, cela ne fonctionne pas. Bien que cela ne devrait pas être un problème car le type t est résolu au moment de la compilation. Je comprends que cela peut être résolu avec la réflexion, mais comme les types sont connus au moment de la compilation, l'utilisation de la réflexion serait excessive.

+0

Est-x aura toujours 10 ou est-ce juste une preuve de concept? Je me demande simplement si vous pouvez éviter d'utiliser le mot-clé var. –

+0

C'est juste une preuve d'un concept. J'essayais d'utiliser ce type de code pour Func <> et Expression <> pour se débarrasser de la frappe redondante. Donc le type pourrait être déclaré explicitement:

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

Répondre

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

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

Nice. Vraiment comme cette solution. – Dykam

+1

+1 Sournois, et fonctionne pour ce cas. :) –

+0

Muy clevar! Bien fait. –

3

Définition de génériques est fait comme en C#:

var someList = new List<int>(); 

Vous pouvez pas définir génériques comme ceci:

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

parce que vous spécifiez le type à l'exécution dans ce cas , ne compile pas le temps. C# ne supporte pas cela.

+4

Vous venez de répéter ce que Max a déclaré dans la question. –

+1

@Anton Non, je n'ai pas, Max est sous l'impression que typeof (x) est résolu au moment de la compilation, ce qui n'est pas correct. – Joseph

+0

@Joseph: Etes-vous sûr? Je sais que x.GetType() est résolu au moment de l'exécution, car il donne le type auquel x fait actuellement référence, mais je pensais que typeof (x) donnerait toujours le type de la variable, tel que défini au moment de la compilation. –

6

Vous essayez d'obtenir .Net pour définir un type générique à l'aide d'un opérateur d'exécution. Comme vous le savez, cela ne fonctionnera pas. Les types génériques doivent être être définis lors de la compilation.

2

Vous ne pouvez pas le faire exactement comment vous demandez, mais avec un peu de réflexion, vous pouvez accomplir la même chose

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

'(Liste )' à la dernière ligne va à l'encontre de votre but. Mais oui, cela est utile dans certains cas. –

Questions connexes