Comment : déduire les types et les noms de propriétés dans des déclarations de types anonymes (Visual Basic)
Les types anonymes ne fournissent pas de mécanisme permettant de spécifier directement les types de données des propriétés. Les types de toutes les propriétés sont déduits. Dans l’exemple suivant, les types de Name
et de Price
sont déduits directement des valeurs utilisées pour les initialiser.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Les types anonymes peuvent également déduire les types et les noms de propriété à partir d’autres sources. Les sections qui suivent décrivent les cas où l’inférence est possible et des cas où elle ne l’est pas.
Inférence possible
Les types anonymes peuvent déduire les types et les noms de propriété à partir des sources suivantes :
Noms de variable. Le type anonyme
anonProduct
a deux propriétés :productName
etproductPrice
. Leurs types de données sont ceux des variables initiales,String
etDouble
respectivement.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}
Noms de propriété ou de champ d’autres objets. Prenez l’exemple d’un objet
car
de typeCarClass
qui a les propriétésName
etID
. Pour créer une instance de type anonymecar1
avec les propriétésName
etID
initialisées avec les valeurs de l’objetcar
, vous pouvez écrire ce qui suit :Dim car1 = New With {Key car.Name, Key car.ID}
La déclaration qui précède équivaut à la plus longue ligne de code qui définit le type anonyme
car2
.Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Noms de membre XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Le type résultant pour
anon
a alors une seule propriété,Book
, de type IEnumerable(Of XElement).Fonction n’ayant aucun paramètre, telle que
SomeFunction
(voir l’exemple suivant).Dim sc As New SomeClass Dim anon1 = New With {Key sc.SomeFunction()}
La variable
anon2
présente dans le code suivant est un type anonyme qui a une seule propriété, un caractère nomméFirst
. Ce code affiche la lettre « E », qui est la lettre retournée par la fonction 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)
Inférence impossible
L’inférence de nom échoue dans de nombreux cas, notamment les suivants :
L’inférence dérive de l’appel d’une méthode, d’un constructeur ou d’une propriété paramétrable qui nécessite des arguments. La déclaration précédente de
anon1
échoue sisomeFunction
a un ou plusieurs arguments.' Not valid. ' Dim anon3 = New With {Key sc.someFunction(someArg)}
L’assignation à un nouveau nom de propriété résout le problème.
' Valid. Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
L’inférence dérive d’une expression complexe.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
L’erreur peut être résolue en assignant le résultat de l’expression à un nom de propriété.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
L’inférence pour plusieurs propriétés produit deux propriétés ou plus, qui portent le même nom. Dans les déclarations des exemples précédents, vous ne pouvez pas spécifier
product.Name
etcar1.Name
en tant que propriétés du même type anonyme. Sinon, l’identificateur déduit pour chaque propriété seraitName
.' Not valid. ' Dim anon5 = New With {Key product.Name, Key car1.Name}
Le problème peut être résolu en assignant les valeurs à des noms de propriété distincts.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Notez que les changements de casse (majuscules et minuscules) ne produisent pas deux noms distincts.
Dim price = 0 ' Not valid, because Price and price are the same name. ' Dim anon7 = New With {Key product.Price, Key price}
Le type et la valeur d’origine d’une propriété dépendent d’une autre propriété qui n’est pas encore établie. Par exemple,
.IDName = .LastName
n’est pas valide dans une déclaration de type anonyme, sauf si.LastName
est déjà initialisé.' Not valid. ' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
Dans cet exemple, vous pouvez résoudre le problème en inversant l’ordre de déclaration des propriétés.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Un nom de propriété de type anonyme est identique au nom d’un membre de la méthode Object. Par exemple, la déclaration suivante échoue, car
Equals
est une méthode Object.' Not valid. ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _ ' "greater than", Key .Less = "less than"}
Vous pouvez résoudre le problème en modifiant le nom de la propriété :
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}