Freigeben über


Vorgehensweise: Ableiten von Eigenschaftsnamen und -typen in anonymen Typdeklarationen (Visual Basic)

Anonyme Typen bieten keinen Mechanismus zum direkten Angeben der Datentypen von Eigenschaften. Typen aller Eigenschaften werden abgeleitet. Im folgenden Beispiel werden die Typen von Name und Price direkt aus den Werten abgeleitet, die zu ihrer Initialisierung verwendet werden.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Anonyme Typen können auch Eigenschaftsnamen und Typen aus anderen Quellen ableiten. Die folgenden Abschnitte enthalten eine Liste der Umstände, unter denen eine Ableitung möglich ist, und Beispiele für Situationen, in denen dies nicht der Fall ist.

Erfolgreiche Ableitung

Anonyme Typen können Eigenschaftsnamen und Typen aus den folgenden Quellen ableiten:

  • Aus Variablennamen. Anonymer Typ anonProduct verfügt über zwei Eigenschaften, productName und productPrice. Ihre Datentypen sind die der ursprünglichen Variablen String bzw. Double.

    Dim productName As String = "paperclips"
    Dim productPrice As Double = 1.29
    Dim anonProduct = New With {Key productName, Key productPrice}
    
    ' To create uppercase variable names for the new properties,
    ' assign variables productName and productPrice to uppercase identifiers.
    Dim anonProduct1 = New With {Key .Name = productName, Key .Price = productPrice}
    
  • Aus Eigenschaften- oder Feldnamen anderer Objekte. Betrachten Sie z. B. ein car Objekt eines CarClass Typs, der Name und ID Eigenschaften enthält. Zum Erstellen einer neuen Instanz des anonymen Typs car1 mit den Eigenschaften Name und ID, die mit den Werten aus dem car Objekt initialisiert werden, können Sie Folgendes schreiben:

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    Die vorherige Deklaration entspricht der längeren Codezeile, die anonymen Typ car2definiert.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Aus XML-Membernamen.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    Der resultierende Typ für anon hätte eine Eigenschaft , Bookvom Typ IEnumerable(Of XElement).

  • Aus einer Funktion, die keine Parameter enthält, abgeleitet, wie beispielweise SomeFunction im folgenden Beispiel.

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    Die Variable anon2 im folgenden Code ist ein anonymer Typ mit einer Eigenschaft, einem Zeichen mit dem Namen First. Dieser Code zeigt den Buchstaben "E" an, der von der Funktion Firstzurückgegeben wird.

    Dim aString As String = "Example String"
    Dim anon2 = New With {Key aString.First()}
    ' The variable anon2 has one property, First.
    Console.WriteLine(anon2.First)
    

Ableitungsfehler

Der Namensbezug schlägt unter vielen Umständen fehl, einschließlich der folgenden:

  • Die Ableitung wird von dem Aufruf einer Methode, eines Konstruktors oder einer parametrisierten Eigenschaft abgeleitet, die Argumente erfordert. Die vorherige Deklaration von anon1 scheitert, wenn someFunction ein oder mehrere Argumente hat.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    Durch Zuweisung zu einem neuen Eigenschaftennamen kann das Problem gelöst werden.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • Die Ableitung wird von einem komplexen Ausdruck abgeleitet.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    Der Fehler kann behoben werden, indem das Ergebnis des Ausdrucks einem Eigenschaftsnamen zugewiesen wird.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Die Schlussfolgerung für mehrere Eigenschaften führt zu zwei oder mehr Eigenschaften mit demselben Namen. Wenn Sie in früheren Beispielen auf die Deklarationen verweisen, können Sie nicht sowohl product.Name als auch car1.Name als Eigenschaften desselben anonymen Typs auflisten. Dies liegt daran, dass der abgeleitete Bezeichner für jede dieser Kennungen lautet Name.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    Das Problem kann durch Zuweisen der Werte zu unterschiedlichen Eigenschaftsnamen gelöst werden.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Beachten Sie, dass Änderungen in der Schreibweise (Änderungen zwischen Groß- und Kleinbuchstaben) keinen Unterschied zwischen zwei Namen machen.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Der anfängliche Typ und Wert einer Eigenschaft hängt von einer anderen Eigenschaft ab, die noch nicht festgelegt wurde. Ein Beispiel ist, dass .IDName = .LastName in einer anonymen Typdeklaration nicht gültig ist, es sei denn, .LastName wurde bereits initialisiert.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    In diesem Beispiel können Sie das Problem beheben, indem Sie die Reihenfolge umkehren, in der die Eigenschaften deklariert werden.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Ein Eigenschaftsname des anonymen Typs entspricht dem Namen eines Mitglieds von Object. Die folgende Deklaration schlägt beispielsweise fehl, weil Equals eine Methode von Object ist.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    Sie können das Problem beheben, indem Sie den Eigenschaftennamen ändern:

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Siehe auch