Gewusst wie: Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen Typen (Visual Basic)

Anonyme Typen stellen keinen Mechanismus zum direkten Angeben der Datentypen von Eigenschaften bereit. Die Typen aller Eigenschaften werden abgeleitet. Im folgenden Beispiel werden die Typen von Name und Price direkt aus den Werten abgeleitet, mit denen sie initialisiert 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 Eigenschaftennamen und -typen auch aus anderen Quellen ableiten. In den folgenden Abschnitten werden sowohl eine Liste der Umstände, unter denen Ableitung möglich ist, als auch Beispiele bereitgestellt, in denen keine Ableitung möglich ist.

Erfolgreiche Ableitung

Anonyme Typen können Eigenschaftennamen und -typen aus folgenden Quellen ableiten:

  • Aus Variablennamen. Der anonyme Typ anonProduct hat die beiden Eigenschaften productName und productPrice. Ihre Datentypen sind gleich denen der ursprünglichen Variablen, also 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 die Name -Eigenschaft und die ID -Eigenschaft enthält. Um die neue Instanz car1des anonymen Typs mit der Name -Eigenschaft und der ID -Eigenschaft zu erstellen, die mit den Werten aus dem car -Objekt initialisiert werden, können Sie folgenden Code schreiben:

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

    Die vorherige Deklaration ist mit der längeren Codezeile gleichwertig, in der der anonyme Typ car2definiert ist.

    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, Book, des Typs IEnumerable(Of XElement).

  • Aus einer Funktion, die keine Parameter hat, z. B. 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, der eine Eigenschaft hat: ein Zeichen namens 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

Die Ableitung von Namen schlägt in vielen Fällen fehl, etwa in den folgenden:

  • Die Ableitung erfolgt über den Aufruf einer Methode, eines Konstruktors oder einer parametrisierten Eigenschaft, die Argumente erfordert. Die vorherige Deklaration von anon1 schlägt fehl, 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 erfolgt aus einem komplexen Ausdruck.

    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 Eigenschaftennamen zugewiesen wird.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Die Ableitung für mehrere Eigenschaften führt zu zwei oder mehr Eigenschaften mit demselben Namen. Ein Rückblick auf die Deklarationen in früheren Beispielen zeigt, dass es nicht möglich ist, sowohl product.Name als auch car1.Name als Eigenschaften desselben anonymen Typs aufzulisten. Dies liegt daran, dass der abgeleitete Bezeichner für beide Eigenschaften gleich Namewäre.

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

    Das Problem kann gelöst werden, indem die Werte unterschiedlichen Eigenschaftennamen zugewiesen werden.

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

    Beachten Sie, dass eine unterschiedliche Schreibweise (Unterschiede in der Groß- und Kleinschreibung) nicht dazu führt, dass zwei Namen unterschiedlich sind.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • Der ursprüngliche Typ und Wert einer Eigenschaft sind von einer anderen Eigenschaft abhängig, die noch nicht festgelegt wurde. Zum Beispiel ist .IDName = .LastName in der Deklaration eines anonymen Typs nicht zulässig, wenn .LastName noch nicht initialisiert wurde.

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

    In diesem Beispiel kann das Problem behoben werden, indem die Reihenfolge, in der die Eigenschaften deklariert werden, umgekehrt wird.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Ein Eigenschaftennamen eines anonymen Typs ist mit dem Namen eines Members von Objectidentisch. Zum Beispiel schlägt die folgende Deklaration fehl, weil Equals eine Methode von Objectist.

    ' 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