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

Gibt es eine andere Möglichkeit zu tun, was ich hier tun möchte?Warum kann ich das nicht mit impliziten Typen in C# machen?

Wenn es gibt nicht, sehe ich nicht wirklich, dass alle viel Sinn, implizite Typen ...

+0

Sie es tun können, aber es dauert Reflexion . Ich kann mich nicht mehr an den genauen Code erinnern, aber ich bin mir sicher, dass jemand bald etwas veröffentlichen wird. –

+0

Wenn Sie den Typ eines Objekts kennen müssen, warum sollten Sie es anonym erstellen? Sie verwenden sie, wenn der Typ keine Rolle spielt oder bekannt sein muss. –

Antwort

12

x.GetType() ist ein Methodenaufruf, zur Ausführungszeit ausgewertet. Es kann daher nicht für eine Kompilierungszeit Konzept wie der Typ einer Variablen verwendet werden. Ich stimme zu, dass es gelegentlich recht praktisch wäre, etwas Ähnliches zu tun (indem man den Kompilierungszeittyp einer Variablen als Typargument an anderer Stelle angibt), aber derzeit nicht. Ich kann nicht sagen, dass ich es regelmäßig vermisse.

aber Sie können tun:

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

Sie könnten auch eine einfache Erweiterung Methode schreiben allgemein eine Liste zu erstellen:

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

(Wählen Sie einen anderen Namen, wenn Sie wollen :)

Dann:

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

Wie Marc zeigt, muss es eigentlich keine Erweiterungsmethode sein. Die einzige wichtige Sache ist, dass der Compiler Typinferenz verwenden kann, um den Typparameter für die Methode auszuarbeiten, so dass Sie nicht versuchen müssen, den anonymen Typ zu benennen.

Implizit typisierte lokale Variablen sind aus verschiedenen Gründen nützlich, aber sie sind besonders nützlich in LINQ, sodass Sie eine Ad-hoc-Projektion erstellen können, ohne explizit einen ganz neuen Typ zu erstellen.

+0

Ahhh. Danke für die Erklärung, und das InList() - Code-Snippet war, was ich gesucht habe. Danke noch einmal! –

6

Es gibt Möglichkeiten, dies mit einer generischen Methode tun:

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

oder durch eine Liste mit Daten erstellen und dann Entleerung ...