2009-10-15 19 views
6
var x = new { a = "foobar", b = 42 }; 
List<x.GetType()> y; 

Existe-t-il une façon différente de faire ce que je veux faire ici?Pourquoi ne puis-je pas le faire avec des types implicites en C#?

S'il n'y a pas, je ne vois pas vraiment tout ce que beaucoup d'intérêt à des types implicites ...

+0

Vous pouvez le faire, mais il faut la réflexion . Je ne me souviens plus du code exact, mais je suis sûr que quelqu'un postera bientôt quelque chose. –

+0

Si vous avez besoin de connaître le type d'un objet, pourquoi le créer de manière anonyme? Vous les utilisez lorsque le type n'a pas d'importance ou doit être connu. –

Répondre

12

x.GetType() est un appel de méthode, évaluée au moment de l'exécution. Il ne peut donc pas être utilisé pour un concept à la compilation comme le type d'une variable. Je suis d'accord que parfois il serait très pratique d'être capable de faire quelque chose de similaire (en spécifiant le type à la compilation d'une variable comme un argument de type ailleurs), mais actuellement vous ne pouvez pas le faire. Je ne peux pas dire que je manque régulièrement quand même.

Cependant, vous pouvez faire:

var x = new { a = "foobar", b = 42 }; 
var y = new[] { x }; 
var z = y.ToList(); 

Vous pouvez aussi écrire une méthode simple d'extension pour créer une liste générique:

public static List<T> InList<T>(this T item) 
{ 
    return new List<T> { item }; 
} 

(choisir un nom différent si vous voulez :)

Ensuite:

var x = new { a = "foobar", b = 42 }; 
var y = x.InList(); 

Comme le montre Marc, il ne s'agit pas du tout d'une méthode d'extension. La seule chose importante est que le compilateur peut utiliser l'inférence de type pour élaborer le paramètre de type pour la méthode afin que vous n'ayez pas à essayer de nommer le type anonyme.

Les variables locales implicitement typées sont utiles pour diverses raisons, mais elles sont particulièrement utiles dans LINQ pour que vous puissiez créer une projection ad-hoc sans créer explicitement un nouveau type.

+0

Ahhh. Merci pour l'explication, et l'extrait de code InList() était ce que je cherchais. Merci encore! –

6

Il y a plusieurs façons de le faire avec une méthode générique:

public static List<T> CreateList<T>(T example) { 
    return new List<T>(); 
} 
... 
var list = CreateList(x); 

ou en créant une liste avec données, puis le vider ...