Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
undproductPrice
. Ihre Datentypen sind die der ursprünglichen VariablenString
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, derName
undID
Eigenschaften enthält. Zum Erstellen einer neuen Instanz des anonymen Typscar1
mit den EigenschaftenName
undID
, die mit den Werten aus demcar
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
car2
definiert.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
vom 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 NamenFirst
. 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, 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 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 auchcar1.Name
als Eigenschaften desselben anonymen Typs auflisten. Dies liegt daran, dass der abgeleitete Bezeichner für jede dieser Kennungen lautetName
.' 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"}