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 EigenschaftenproductName
undproductPrice
. Ihre Datentypen sind gleich denen der ursprünglichen Variablen, alsoString
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 einesCarClass
-Typs, der dieName
-Eigenschaft und dieID
-Eigenschaft enthält. Um die neue Instanzcar1
des anonymen Typs mit derName
-Eigenschaft und derID
-Eigenschaft zu erstellen, die mit den Werten aus demcar
-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
car2
definiert 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 namensFirst
. 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, wennsomeFunction
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 auchcar1.Name
als Eigenschaften desselben anonymen Typs aufzulisten. Dies liegt daran, dass der abgeleitete Bezeichner für beide Eigenschaften gleichName
wä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"}