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


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

См. также