Sdílet prostřednictvím


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ě vlastnosti productName a productPrice. Jejich datové typy budou ty z původních proměnných String a Doublev 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 objekt CarClass typu, který zahrnuje Name a ID vlastnosti. Chcete-li vytvořit novou instanci anonymního typu , car1s Name a ID vlastnosti, které jsou inicializovány s hodnotami z objektu car , 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, Booktyp 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ázvem First. 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í, pokud someFunction 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.Namecar1.Name jako vlastnosti stejného anonymního typu. Je to proto, že odvozený identifikátor pro každý z nich by byl Name.

    ' 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"}
    

Viz také