Como: Inferir nomes de propriedade e tipos em declarações de tipo anônimo (Visual Basic)

Os tipos anônimos não fornecem nenhum mecanismo para especificar diretamente os tipos de dados das propriedades. Os tipos de todas as propriedades são inferidos. No exemplo a seguir, os tipos de e Price são inferidos Name diretamente dos valores usados para inicializá-los.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Os tipos anônimos também podem inferir nomes e tipos de propriedades de outras fontes. As secções que se seguem fornecem uma lista das circunstâncias em que a inferência é possível e exemplos de situações em que tal não acontece.

Inferência bem-sucedida

Os tipos anônimos podem inferir nomes e tipos de propriedade das seguintes fontes:

  • A partir de nomes de variáveis. O tipo anonProduct anônimo terá duas propriedades productName e productPrice. Seus tipos de dados serão os das variáveis String originais e Double, respectivamente.

    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}
    
  • De nomes de propriedades ou campos de outros objetos. Por exemplo, considere um car objeto de um CarClass tipo que inclui Name e ID propriedades. Para criar uma nova instância de tipo anônimo, car1, com Name e ID propriedades que são inicializadas com os valores do objeto, você pode escrever o car seguinte:

    Dim car1 = New With {Key car.Name, Key car.ID}
    

    A declaração anterior é equivalente à linha de código mais longa que define o tipo car2anônimo.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • De nomes de membros XML.

    Dim books = <Books>
                    <Book Author="Jesper Aaberg">
                        Advanced Programming Methods
                    </Book>
                </Books>
    Dim anon = New With {books...<Book>}
    

    O tipo resultante para anon teria uma propriedade, Book, do tipo IEnumerable(Of XElement).

  • De uma função que não tem parâmetros, como SomeFunction no exemplo a seguir.

    Dim sc As New SomeClass
    Dim anon1 = New With {Key sc.SomeFunction()}
    

    A variável anon2 no código a seguir é um tipo anônimo que tem uma propriedade, um caractere chamado First. Esse código exibirá uma letra "E", a letra que é retornada por função 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)
    

Falhas de inferência

A inferência de nome falhará em muitas circunstâncias, incluindo o seguinte:

  • A inferência deriva da invocação de um método, um construtor ou uma propriedade parametrizada que requer argumentos. A declaração anterior de anon1 reprovação se someFunction tiver um ou mais argumentos.

    ' Not valid.
    ' Dim anon3 = New With {Key sc.someFunction(someArg)}
    

    A atribuição a um novo nome de propriedade resolve o problema.

    ' Valid.
    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
    
  • A inferência deriva de uma expressão complexa.

    Dim aString As String = "Act "
    ' Not valid.
    ' Dim label = New With {Key aString & "IV"}
    

    O erro pode ser resolvido atribuindo o resultado da expressão a um nome de propriedade.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • A inferência para várias propriedades produz duas ou mais propriedades que têm o mesmo nome. Referindo-se a declarações em exemplos anteriores, não é possível listar ambas e product.Namecar1.Name como propriedades do mesmo tipo anônimo. Isso ocorre porque o identificador inferido para cada um deles seria Name.

    ' Not valid.
    ' Dim anon5 = New With {Key product.Name, Key car1.Name}
    

    O problema pode ser resolvido atribuindo os valores a nomes de propriedade distintos.

    ' Valid.
    Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
    

    Observe que as alterações em maiúsculas e minúsculas (alterações entre letras maiúsculas e minúsculas) não tornam dois nomes distintos.

    Dim price = 0
    ' Not valid, because Price and price are the same name.
    ' Dim anon7 = New With {Key product.Price, Key price}
    
  • O tipo inicial e o valor de uma propriedade dependem de outra propriedade que ainda não está estabelecida. Por exemplo, não é válido em uma declaração de tipo anônimo, .IDName = .LastName a menos que .LastName já tenha sido inicializado.

    ' Not valid.
    ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
    

    Neste exemplo, você pode corrigir o problema invertendo a ordem em que as propriedades são declaradas.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Um nome de propriedade do tipo anônimo é o mesmo que o nome de um membro do Object. Por exemplo, a seguinte declaração falha porque Equals é um método de Object.

    ' Not valid.
    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
    '                       "greater than", Key .Less = "less than"}
    

    Você pode corrigir o problema alterando o nome da propriedade:

    ' Valid 
    Dim relationsLabels2 = New With {Key .EqualString = "equals",
                                     Key .GreaterString = "greater than",
                                     Key .LessString = "less than"}
    

Consulte também