Projizieren eines anonymen Typs (LINQ to XML)

In einigen Fällen empfiehlt es sich, eine Abfrage auf einen neuen Typ zu projizieren, der jedoch nur in dieser Abfrage verwendet werden würde. Anstatt den Typ zu erstellen, können Sie auf einen anonymen Typ projizieren. Anonyme Typen stellen eine praktische Möglichkeit dar, schreibgeschützte Eigenschaften in einem Objekt zu kapseln, ohne zuerst explizit einen Typ definieren zu müssen. Wenn Sie eine Abfrage schreiben, die ein Objekt eines anonymen Typs in der select-Klausel erstellt, gibt die Abfrage eine IEnumerable-Schnittstelle des Typs zurück.

Das folgende Beispiel zeigt die Erstellung eines Objekts eines anonymen Typs, das mit zwei Eigenschaften (Amount und Message) initialisiert wird.

var v = new { Amount = 108, Message = "Hello" };
Dim v = New With { .Amount = 108, .Message = "Hello" };

Der Typ der einzelnen Eigenschaften wird vom Compiler abgeleitet. Der Typname wird vom Compiler generiert und ist auf Quellcodeebene nicht verfügbar.

Weitere Informationen zu anonymen Typen finden Sie unter:

Beispiel: Projizieren eines anonymen Typs durch Erstellen von Objekten in der select-Klausel

In diesem Beispiel projiziert die select-Klausel einen anonymen Typ. Das Beispiel verwendet dann var, um das IEnumerable-Objekt zu erstellen. Innerhalb der foreach-Schleife wird die Iterationsvariable zu einer Instanz des im Abfrageausdruck erstellten anonymen Typs.

In diesem Beispiel wird das XML-Dokument XML-Beispieldatei: Kunden und Bestellungen verwendet.

XElement custOrd = XElement.Load("CustomersOrders.xml");
var custList =
    from el in custOrd.Element("Customers").Elements("Customer")
    select new {
        CustomerID = (string)el.Attribute("CustomerID"),
        CompanyName = (string)el.Element("CompanyName"),
        ContactName = (string)el.Element("ContactName")
    };
foreach (var cust in custList)
    Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName);
Dim custOrd As XElement = XElement.Load("CustomersOrders.xml")
Dim custList = _
    From el In custOrd.<Customers>.<Customer> _
    Select New With { _
        .CustomerID = el.@<CustomerID>, _
        .CompanyName = el.<CompanyName>.Value, _
        .ContactName = el.<ContactName>.Value _
    }
For Each cust In custList
    Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName)
Next

Dieses Beispiel erzeugt die folgende Ausgabe:

GREAL:Great Lakes Food Market:Howard Snyder
HUNGC:Hungry Coyote Import Store:Yoshi Latimer
LAZYK:Lazy K Kountry Store:John Steel
LETSS:Let's Stop N Shop:Jaime Yorres

Siehe auch