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 propriedadesproductName
eproductPrice
. Seus tipos de dados serão os das variáveisString
originais 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 propriedades ou campos de outros objetos. Por exemplo, considere um
car
objeto de umCarClass
tipo que incluiName
eID
propriedades. Para criar uma nova instância de tipo anônimo,car1
, comName
eID
propriedades que são inicializadas com os valores do objeto, você pode escrever ocar
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
car2
anô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 chamadoFirst
. 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 sesomeFunction
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.Name
car1.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 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"}