Поделиться через


Практическое руководство. Выведение имен свойств и типов в объявлениях анонимных типов (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``1.

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

См. также

Ссылки

Key (Visual Basic)

Основные понятия

Инициализаторы объектов: именованные и анонимные типы (Visual Basic)

Вывод локального типа (Visual Basic)

Анонимные типы (Visual Basic)