Procedure: Eigenschapsnamen en -typen afleiden in anonieme typedeclaraties (Visual Basic)
Anonieme typen bieden geen mechanisme voor het rechtstreeks opgeven van de gegevenstypen van eigenschappen. Typen van alle eigenschappen worden afgeleid. In het volgende voorbeeld worden de typen Name
en Price
deze rechtstreeks afgeleid van de waarden die worden gebruikt om ze te initialiseren.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Anonieme typen kunnen ook eigenschapsnamen en -typen afleiden uit andere bronnen. De volgende secties bevatten een lijst met de omstandigheden waar deductie mogelijk is en voorbeelden van situaties waarin dit niet het geval is.
Geslaagde deductie
Anonieme typen kunnen eigenschapsnamen en -typen afleiden uit de volgende bronnen:
Van namen van variabelen. Anoniem type
anonProduct
heeft twee eigenschappen enproductName
productPrice
. Hun gegevenstypen zijn respectievelijk die van de oorspronkelijke variabelenString
enDouble
, respectievelijk.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}
Van eigenschaps- of veldnamen van andere objecten. Denk bijvoorbeeld aan een
car
object van eenCarClass
type dat eigenschappen bevat enID
bevatName
. Als u een nieuw anoniem typeexemplaren wilt maken,car1
metName
enID
eigenschappen die zijn geïnitialiseerd met de waarden van hetcar
object, kunt u het volgende schrijven:Dim car1 = New With {Key car.Name, Key car.ID}
De vorige declaratie is gelijk aan de langere coderegel die anoniem type
car2
definieert.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Van XML-lidnamen.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Het resulterende type heeft
anon
één eigenschap,Book
van het type IEnumerable(van XElement).Van een functie die geen parameters heeft, zoals
SomeFunction
in het volgende voorbeeld.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
De variabele
anon2
in de volgende code is een anoniem type met één eigenschap, een teken met de naamFirst
. Met deze code wordt een letter 'E' weergegeven, de letter die door de functie Firstwordt geretourneerd.Dim aString As String = "Example String" Dim anon2 = New With {Key aString.First()} ' The variable anon2 has one property, First. Console.WriteLine(anon2.First)
Deductiefouten
Naamdeductie mislukt in veel gevallen, waaronder de volgende:
De deductie is afgeleid van de aanroep van een methode, een constructor of een geparameteriseerde eigenschap waarvoor argumenten zijn vereist. De vorige declaratie van
anon1
mislukt alssomeFunction
er een of meer argumenten zijn.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
Toewijzing aan een nieuwe eigenschapsnaam lost het probleem op.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
De deductie is afgeleid van een complexe expressie.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
De fout kan worden opgelost door het resultaat van de expressie toe te wijzen aan een eigenschapsnaam.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Deductie voor meerdere eigenschappen produceert twee of meer eigenschappen met dezelfde naam. Als u terugwijst naar declaraties in eerdere voorbeelden, kunt u zowel
product.Name
alscar1.Name
als eigenschappen van hetzelfde anonieme type niet weergeven. Dit komt doordat de uitgestelde id voor elk van deze zou zijnName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
Het probleem kan worden opgelost door de waarden toe te wijzen aan afzonderlijke eigenschapsnamen.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Houd er rekening mee dat wijzigingen in het geval (wijzigingen tussen hoofdletters en kleine letters) geen twee namen onderscheiden.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Het oorspronkelijke type en de waarde van de ene eigenschap zijn afhankelijk van een andere eigenschap die nog niet tot stand is gebracht. Is bijvoorbeeld
.IDName = .LastName
niet geldig in een anonieme typedeclaratie, tenzij.LastName
deze al is geïnitialiseerd.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
In dit voorbeeld kunt u het probleem oplossen door de volgorde te wijzigen waarin de eigenschappen worden gedeclareerd.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Een eigenschapsnaam van het anonieme type is hetzelfde als de naam van een lid van Object. De volgende declaratie mislukt bijvoorbeeld omdat
Equals
dit een methode is van Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
U kunt het probleem oplossen door de naam van de eigenschap te wijzigen:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}