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

C'è un modo diverso di fare ciò che voglio fare qui?Perché non posso farlo con tipi impliciti in C#?

Se non c'è, non ho davvero vedere tutto ciò che ha più molto senso tipi impliciti ...

+0

Si può fare, ma ci vuole riflessione . Non riesco a ricordare il codice esatto in cima alla mia testa, ma sono sicuro che qualcuno pubblicherà qualcosa presto. –

+0

Se è necessario conoscere il tipo di un oggetto, perché lo si dovrebbe creare in modo anonimo? Li usi quando il tipo non ha importanza o deve essere conosciuto. –

risposta

12

x.GetType() è una chiamata di metodo, valutata al momento dell'esecuzione. Pertanto non può essere utilizzato per un concetto in fase di compilazione come il tipo di una variabile. Sono d'accordo che occasionalmente sarebbe abbastanza utile essere in grado di fare qualcosa di simile (specificando il tipo di tempo di compilazione di una variabile come argomento di tipo altrove), ma al momento non è possibile. Non posso dire che mi manca regolarmente però.

Tuttavia, è possibile fare:

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

Si potrebbe anche scrivere un metodo di estensione semplice per creare un elenco generico:

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

(scegliere un nome diverso se si vuole :)

Quindi:

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

Come mostra Marc, in realtà non deve essere affatto un metodo di estensione. L'unica cosa importante è che il compilatore può utilizzare l'inferenza del tipo per elaborare il parametro type per il metodo in modo che non sia necessario provare a nominare il tipo anonimo.

Le variabili locali implicitamente tipizzate sono utili per una serie di motivi, ma sono particolarmente utili in LINQ in modo che sia possibile creare una proiezione ad-hoc senza creare un tipo completamente nuovo esplicitamente.

+0

Ahhh. Grazie per la spiegazione e lo snippet di codice InList() era quello che stavo cercando. Grazie ancora! –

6

Ci sono modi di fare questo con un metodo generico:

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

o creando un elenco con i dati e poi svuotarlo ...

Problemi correlati