Практическое руководство. Выведение имен свойств и типов в объявлениях анонимных типов (Visual Basic)
Анонимные типы не предоставляют механизм для прямого задания типов с данными свойствами. Выводятся типы всех свойств. В следующем примере типы Name и Price переносятся напрямую из значений, которые используются для их инициализации.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Анонимные типы также могут определить имена свойств и типы из других источников. В следующих разделах показан список случаев, когда получение возможно и примеры ситуаций, когда нет.
Успешное получение
Анонимные типы также могут определить имена свойств и типы из следующих источников:
Из имен переменных. Анонимный тип anonProduct получит два свойства productName и productPrice. Их типы данных будут те же, что и у исходных переменных: String и Double, соответственно.
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}
Из свойства или поля имен других объектов. Например, рассмотрим объект car типа CarClass, включающий свойства Name и ID. Для создания нового экземпляра анонимного типа, car1, со свойствами Name и ID, которые инициализируются значениями из объекта car можно написать следующее:
Dim car1 = New With {Key car.Name, Key car.ID}
Предыдущее объявление эквивалентно большей строке кода, определяющей анонимный тип car2.
Dim car2 = New With {Key .Name = car.Name, Key .ID = car.ID}
Из имен членов XML.
Dim books = <Books> <Book Author="Jesper Aaberg"> Advanced Programming Methods </Book> </Books> Dim anon = New With {books...<Book>}
Результирующий тип для anon будет иметь одно свойство, Book, типа IEnumerable (XElement).
Из функции, не имеющей параметров, например, SomeFunction в следующем примере.
Dim sc As New SomeClass
Dim anon1 = New With {Key sc.SomeFunction()}
Переменная anon2 в следующем коде является анонимным типом, имеющим одно свойство, знак с именем First. Этот код будет отображать букву "E", букву, которая возвращена функцией 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)
Ошибки получения
Передача имени потерпит неудачу во многих случаях, в том числе в следующих:
Получение является производным от вызова метода, конструктора или параметризованного свойства, для которого требуются аргументы. Предыдущее объявление anon1 не выполняется, если someFunction имеет один или несколько аргументов.
' Not valid.
' Dim anon3 = New With {Key sc.someFunction(someArg)}
Присвоение нового имени свойству решает проблему.
' Valid.
Dim anon4 = New With {Key .FunResult = sc.someFunction(someArg)}
Получение является производным от сложного выражения.
Dim aString As String = "Act " ' Not valid. ' Dim label = New With {Key aString & "IV"}
Ошибку можно устранить, назначив результат выражения именем свойства.
' Valid. Dim label1 = New With {Key .someLabel = aString & "IV"}
Получение для нескольких свойств создает два или несколько свойств, имеющих одинаковое имя. При использовании обратных ссылок на объявления в предыдущих примерах, нельзя включить в список одновременно product.Name и car1.Name как свойства одного и того же анонимного типа. Это происходит потому, что получаемый идентификатор для каждого из них будет Name.
' Not valid.
' Dim anon5 = New With {Key product.Name, Key car1.Name}
Проблема может быть решена назначением значений для различных имен свойств.
' Valid. Dim anon6 = New With {Key .ProductName = product.Name, Key .CarName = car1.Name}
Обратите внимание, что в случае различия (различия между прописными и строчными буквами) два различных имени не будет создано.
Dim price = 0
' Not valid, because Price and price are the same name.
' Dim anon7 = New With {Key product.Price, Key price}
Исходный тип и значение одного свойства зависят от других свойств, которые еще не реализованы. Например, .IDName = .LastName не является допустимым в объявлении анонимного типа, если .LastName уже инициализирован.
' Not valid.
' Dim anon8 = New With {Key .IDName = .LastName, Key .LastName = "Jones"}
В этом примере можно устранить неполадки инвертированием порядка, в котором были объявлены свойства.
' Valid. Dim anon9 = New With {Key .LastName = "Jones", Key .IDName = .LastName}
Имя свойства анонимного типа совпадает с именем члена Object. Например, следующее объявление завершается неудачно, поскольку Equals — это метод Object.
' Not valid.
' Dim relationsLabels1 = New With {Key .Equals = "equals", Key .Greater = _
' "greater than", Key .Less = "less than"}
Можно решить проблему путем изменения имени свойства:
' Valid Dim relationsLabels2 = New With {Key .EqualString = "equals", Key .GreaterString = "greater than", Key .LessString = "less than"}
См. также
Задачи
Практическое руководство. Объявление экземпляра анонимного типа (Visual Basic)
Ссылки
Основные понятия
Инициализаторы объектов: именованные и анонимные типы (Visual Basic)