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
Koncepcje
Inicjatory obiekt: Nazwany i anonimowe typów (Visual Basic)