Postupy: Odvození názvů a typů vlastností v deklaracích anonymního typu (Visual Basic)
Anonymní typy neposkytují žádný mechanismus pro přímé zadání datových typů vlastností. Typy všech vlastností jsou odvozeny. V následujícím příkladu jsou typy Name
a Price
jsou odvozeny přímo z hodnot, které se používají k jejich inicializaci.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Anonymní typy mohou také odvodit názvy a typy vlastností z jiných zdrojů. Následující části obsahují seznam okolností, kdy je možné odvozovat, a příklady situací, kdy tomu tak není.
Úspěšné odvození
Anonymní typy mohou odvodit názvy a typy vlastností z následujících zdrojů:
Z názvů proměnných. Anonymní typ
anonProduct
bude mít dvě vlastnostiproductName
aproductPrice
. Jejich datové typy budou ty z původních proměnnýchString
aDouble
v uvedeném pořadí.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}
Z názvů vlastností nebo polí jiných objektů. Představte si
car
například objektCarClass
typu, který zahrnujeName
aID
vlastnosti. Chcete-li vytvořit novou instanci anonymního typu ,car1
sName
aID
vlastnosti, které jsou inicializovány s hodnotami z objektucar
, můžete napsat následující:Dim car1 = New With {Key car.Name, Key car.ID}
Předchozí deklarace je ekvivalentní delšímu řádku kódu, který definuje anonymní typ
car2
.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Z názvů členů XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Výsledný typ by
anon
měl jednu vlastnost,Book
typ IEnumerable(Of XElement).Z funkce, která nemá žádné parametry, například
SomeFunction
v následujícím příkladu.Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
Proměnná
anon2
v následujícím kódu je anonymní typ, který má jednu vlastnost, znak s názvemFirst
. Tento kód zobrazí písmeno "E", písmeno, které je vráceno funkcí First.Dim aString As String = "Example String" Dim anon2 = New With {Key aString.First()} ' The variable anon2 has one property, First. Console.WriteLine(anon2.First)
Selhání odvození
Odvození názvu selže za mnoha okolností, včetně následujících:
Odvození vychází z vyvolání metody, konstruktoru nebo parametrizované vlastnosti, která vyžaduje argumenty. Předchozí deklarace
anon1
selhání, pokudsomeFunction
obsahuje jeden nebo více argumentů.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
Přiřazení k novému názvu vlastnosti vyřeší problém.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
Odvození je odvozeno od komplexního výrazu.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
Chybu lze vyřešit přiřazením výsledku výrazu k názvu vlastnosti.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Odvození více vlastností vytvoří dvě nebo více vlastností se stejným názvem. Odkazující zpět na deklarace v předchozích příkladech nelze vypsat jak vlastnosti stejného anonymního typu, tak
product.Name
car1.Name
jako vlastnosti stejného anonymního typu. Je to proto, že odvozený identifikátor pro každý z nich by bylName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
Problém lze vyřešit přiřazením hodnot k odlišným názvům vlastností.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Všimněte si, že změny v případě (změny mezi velkými a malými písmeny) nedělají dva názvy odlišné.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Počáteční typ a hodnota jedné vlastnosti závisí na jiné vlastnosti, která ještě není vytvořena.
.IDName = .LastName
Například není platný v deklaraci anonymního typu, pokud.LastName
není již inicializován.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
V tomto příkladu můžete problém vyřešit vrácením pořadí, ve kterém jsou vlastnosti deklarovány.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Název vlastnosti anonymního typu je stejný jako název člena Object. Například následující deklarace selže, protože
Equals
je metoda Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
Problém můžete vyřešit změnou názvu vlastnosti:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}