Como inferir nomes e tipos de propriedade em declarações de tipo anônimo (Visual Basic)
Tipos anônimos não fornecem nenhum mecanismo para especificar diretamente os tipos de dados de propriedades. Tipos de todas as propriedades são inferidos. No exemplo a seguir, os tipos de Name
e Price
são inferidos diretamente dos valores que são usados para inicializá-los.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Tipos anônimos também podem inferir nomes de propriedades e tipos de outras fontes. As seções a seguir fornecem uma lista das circunstâncias em que a inferência é possível e exemplos de situações em que ela não está.
Inferência bem-sucedida
Tipos anônimos podem inferir nomes de propriedades e tipos das seguintes fontes:
De nomes de variáveis. O tipo anônimo
anonProduct
terá duas propriedadesproductName
eproductPrice
. Seus tipos de dados serão os das variáveis originais,String
eDouble
, 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 propriedade ou de campo de outros objetos. Por exemplo, considere um objeto
car
de um tipoCarClass
que inclui as propriedadesName
eID
. Para criar uma nova instância de tipo anônimo,car1
com as propriedadesName
eID
inicializadas com os valores do objetocar
, você pode escrever o 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 anônimo
car2
.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
De nomes de membro 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 chamadoFirst
. Esse código exibirá uma letra "E", a letra retornada pela 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 a 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
falha sesomeFunction
tiver um ou mais argumentos.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
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. Fazendo referência a declarações em exemplos anteriores, você não pode listar ambas as propriedades
product.Name
ecar1.Name
como propriedades do mesmo tipo anônimo. Isso ocorre porque o identificador inferido para cada um deles seriaName
.' 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 no caso (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 foi estabelecida. Por exemplo,
.IDName = .LastName
não é válido em uma declaração de tipo anônimo, a menos que.LastName
já esteja inicializado.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
Neste exemplo, você pode corrigir o problema invertendo a ordem na qual 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 de Object. Por exemplo, a declaração a seguir 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"}