Udostępnij za pośrednictwem


Jak: wywnioskować nazwy właściwości i typów w deklaracji typu anonimowego (Visual Basic)

Typy anonimowe zapewniają mechanizm określania bezpośrednio typy danych właściwości.Typy wszystkie właściwości są ich doszukiwać.W poniższym przykładzie, rodzaje Name i Price są wywnioskować bezpośrednio z wartości, które są używane do inicjowania je.

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

Typy anonimowe mogą również wywnioskować nazwy właściwości i typów z innych źródeł.Poniższe sekcje zawierają wykaz okoliczności, w których możliwe jest wnioskowanie i przykłady sytuacji, gdy nie jest.

Wnioskowanie pomyślne

Typy anonimowe można rozpoznać nazwy właściwości i typów z następujących źródeł:

  • Z nazwy zmiennej.Typ anonimowy anonProduct będzie miał dwie właściwości, productName i productPrice.Ich typy danych będą te zmienne oryginalny, String i Double, odpowiednio.

    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}
    
  • Właściwość lub pole nazw innych obiektów.Rozważmy na przykład car obiekt z CarClass typu, który zawiera Name i ID właściwości.Aby utworzyć nowe wystąpienie typ anonimowy, car1, z Name i ID właściwości, które są inicjowane wartościami z car obiektów, można napisać poniższy kod:

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

    Poprzedniej deklaracji jest równoważne z dłuższą linię kodu, który definiuje typ anonimowy car2.

    Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
    
  • Od nazwy składników XML.

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

    Wynikowy typ dla anon miałoby jedną właściwość, Book, typu IEnumerable(Z XElement).

  • Z funkcji, która nie ma parametrów, takich jak SomeFunction w następującym przykładzie.

    Dim sc As New SomeClass

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

    Zmienna anon2 w poniższym kodzie jest typ anonimowy, który ma jedną właściwość, znak o nazwie First.Kod ten będzie wyświetlany literę "E" literą, która jest zwracana przez funkcję 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)
    

Wnioskowanie awarii

Nazwa wnioskowanie nie powiedzie się w wielu okolicznościach, w tym następujące:

  • Wnioskowanie pochodzi od wywołania metody, konstruktora lub sparametryzowanych właściwość, która wymaga argumentów.Poprzednią deklarację anon1 kończy się niepowodzeniem, jeśli someFunction ma jeden lub więcej argumentów.

    ' Not valid.

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

    Przypisanie do nowej nazwy właściwości rozwiązuje problem.

    ' Valid.

    Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}

  • Wnioskowanie pochodzi od złożonych wyrażeń.

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

    Błąd może być rozwiązany przez przypisywanie wynik wyrażenia nazwę właściwości.

    ' Valid.
    Dim label1 = New With {Key .someLabel = aString & "IV"}
    
  • Wnioskowanie dla wielu właściwości produkuje dwa lub więcej właściwości, które mają taką samą nazwę.Wróć odnoszące się do deklaracji w przykładach wcześniejszych, nie możesz wystawiać zarówno product.Name i car1.Name jako właściwości tego samego rodzaju anonimowe.To dlatego, byłoby nie powiązano identyfikator dla każdego z nich Name.

    ' Not valid.

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

    Problem można rozwiązać przez przypisanie wartości do właściwości różne nazwy.

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

    Należy zauważyć, że zmiany w przypadku (zmiany między wielkie i małe litery) nie należy wprowadzać nazwy dwóch odrębnych.

    Dim price = 0

    ' Not valid, because Price and price are the same name.

    ' Dim anon7 = New With {Key product.Price, Key price}

  • Początkowy typ i wartość jednej właściwości zależy od innej właściwości, która nie jest jeszcze ustanowione.Na przykład .IDName = .LastName nie jest prawidłowy w deklaracji na typ anonimowy chyba że .LastName jest już zainicjowany.

    ' Not valid.

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

    W tym przykładzie można naprawić ten problem, odwracając kolejność, w której zgłaszane są właściwości.

    ' Valid.
    Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
    
  • Nazwa właściwości typu anonimowego jest taka sama jak nazwa członka Object.Na przykład, następująca deklaracja nie powiedzie się, ponieważ Equals jest to metoda Object.

    ' Not valid.

    ' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _

    ' "greater than", Key .Less = "less than"}

    Zmieniając nazwę właściwości, można naprawić ten problem:

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

Zobacz też

Informacje

Klucz (Visual Basic)

Koncepcje

Inicjatory obiekt: Nazwany i anonimowe typów (Visual Basic)

Wnioskowanie typu lokalnego (Visual Basic)

Typy anonimowe (Visual Basic)