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 et productPrice. Leurs types de données sont ceux des variables initiales, String et Doublerespectivement.

    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 type CarClass qui a les propriétés Name et ID . Pour créer une instance de type anonyme car1avec les propriétés Name et ID initialisées avec les valeurs de l’objet car , 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 si someFunction 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 et car1.Name en tant que propriétés du même type anonyme. Sinon, l’identificateur déduit pour chaque propriété serait Name.

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

Voir aussi